ซอฟแวร์การทำแผนที่เว็บสำหรับชุดเวลาแรสเตอร์ขนาดใหญ่?


11

ฉันเป็นผู้ใช้ ArcGIS Desktop ที่ก้าวเข้าสู่โลกแห่งการทำแผนที่เว็บเป็นครั้งแรก ตามคำแนะนำของผมพบว่าที่นี่ใน GIS.SE ผมเริ่มต้นด้วยบทแนะนำฟรีจากOpenGeo

อย่างไรก็ตามฉันเริ่มตระหนักว่าการสาธิตและตัวอย่างส่วนใหญ่มุ่งเน้นไปที่ข้อมูลเวกเตอร์ โครงการหลักของฉันเกี่ยวข้องกับการแสดงซีรีส์กรอบเวลา 300 ภาพด้วย 5,000 x 5,000 พิกเซลแรสเตอร์ บนคอมพิวเตอร์เดสก์ท็อปของฉันจะถูกเก็บไว้ในไบนารี BIP จำนวนเต็ม 5000x5000x300 16 บิตซึ่งมีขนาดประมาณ 8GB เป้าหมายของฉันคือสามารถคลิกที่เซลล์ (ของแรสเตอร์เดียวในอนุกรมเวลา) และให้กราฟแสดงค่าของพิกเซลนั้นในซีรีย์เวลา 300 องค์ประกอบ ข้อมูลแรสเตอร์ที่ใช้สำหรับกราฟอนุกรมเวลาแต่ละครั้งจะต้องถูกเก็บไว้อย่างไม่สูญเสียแม้ว่าแผนที่ซ้อนทับที่คลิกจะเป็นแคชที่สูญเสียไป

มีสิ่งใดบ้างที่เหมาะกับโครงการนี้ (สำหรับนักพัฒนาเว็บ GIS มือใหม่) ดีกว่า OpenGeo หรือไม่ หรือฉันควรจะไปกับการตั้งค่านี้หรือไม่

สำหรับการอ้างอิงฉันมีประสบการณ์การเขียนโปรแกรมใน Python, Java และ PHP ฉันไม่มีประสบการณ์มากกับ SQL นี่เป็นโครงการปลายเปิดดังนั้นฉันมีเวลามากมายในการเรียนรู้ภาษาใหม่หากจำเป็น ฉันมีเว็บเซิร์ฟเวอร์อยู่แล้วแม้ว่าฉันจะต้องเปลี่ยนโฮสต์เพราะ GoDaddy ดูเหมือนจะไม่สนับสนุน PostgreSQL โดยไม่ได้รับ VPS

ขอบคุณสำหรับความช่วยเหลือของคุณ!

แก้ไข: (13 มกราคม) ฉันยังคงหาข้อมูลเกี่ยวกับวิธีการที่ดีที่สุดในการจัดเก็บ BIP แรสเตอร์ 3 มิติ 16 บิตแบบ 3 มิติและสามารถค้นหาแกน z "แกน" เดียวของข้อมูลได้อย่างมีประสิทธิภาพ ฉันไม่ต้องการแปลงเป็นรูปแบบ 32 บิต (เนื่องจากจะเพิ่มขนาดไฟล์เป็นสองเท่าจากรูปแบบ 16 บิตปัจจุบัน)


2
คุณสามารถวาง PostgreSQL / PostGIS บนเว็บเซิร์ฟเวอร์ของคุณได้หรือไม่? - ขอแนะนำอย่างยิ่งให้มีเซิร์ฟเวอร์ของคุณเองเว้นแต่คุณกำลังมองหาตัวเลือกที่ปรับขนาดได้แล้ว Amazon AWS (ฐานข้อมูลเชิงสัมพันธ์ EC2 AMI) aws.amazon.com/running_databasesอาจเป็นตัวเลือก
Mapperz

1
โฮสต์ของฉัน (GoDaddy) ไม่รองรับ PostgreSQL ตามหัวข้อนี้ ฉันไม่ต้องการความยืดหยุ่นในการปรับขนาด - โครงการนี้ส่วนใหญ่จะช่วยให้นักวิจัยบางคนสามารถเข้าถึงข้อมูลของฉันได้ง่ายกว่าการส่งไฟล์ 8GB และโหลดใน ENVI
dmahr

1
หากคุณกำลังพิจารณาโฮสต์ใหม่ฉันไม่สามารถแนะนำ webfaction สูงพอ พวกเขาเสนอ postgresql / postgis1.5 แต่สำหรับฟังก์ชั่นแรสเตอร์คุณอาจต้องการ postgis2.0 นี่เป็นโฮสติ้งที่ใช้ร่วมกันด้วย
djq

คำตอบ:


6

แก้ไข: (13 มกราคม) ฉันยังคงหาข้อมูลเกี่ยวกับวิธีการที่ดีที่สุดในการเก็บแรสเตอร์ BIP จำนวนเต็ม 3 มิติ 16 บิตและสามารถค้นหาแกน z คอลัมน์เดียวของข้อมูลได้อย่างมีประสิทธิภาพ ฉันไม่ต้องการแปลงเป็นรูปแบบ 32 บิต (เพราะจะเพิ่มขนาดไฟล์เป็นสองเท่าจากรูปแบบ 16 บิตปัจจุบัน)

การสืบค้นแรสเตอร์เช่นนี้ไม่ควรก่อให้เกิดปัญหาใหญ่ คุณสามารถอ่านข้อมูลไบนารีโดยตรงโดยใช้ภาษาโปรแกรมทั้งหมดและการเข้าถึงนั้นรวดเร็ว เพียงตรวจสอบให้แน่ใจว่าคุณเก็บข้อมูลของคุณในรูปแบบไฟล์ที่มีข้อมูลเมตาทั้งหมดในไฟล์แยกต่างหาก BIP เป็นรูปแบบดังกล่าว

เช่นใน php สมมติว่าไฟล์เป็นคำสั่งแถวหลัก (เช่นสลับ x และ y) โดยมี $ x และ $ y ตำแหน่งในกริดของคุณ (นับจาก 0), $ nx, $ ny และ $ nz จำนวนพิกเซลใน แต่ละส่วนข้อมูลและ $ nb จำนวนไบต์ต่อกริดเซล:

$fp = fopen('yourfile.bil', 'r');

fseek ($fp, $nz*$nb*($y*$nx +$x))//this is a very fast operation
// read some data
$data = fread($fp, $nz*nb);//this is also very fast

ตรวจสอบให้แน่ใจว่าคุณเข้าถึงพิกเซลที่ถูกต้อง: การนับเริ่มจากซ้ายบนหรือไม่ ...

ข้อมูลพิเศษบางอย่าง: หลังจากอ่านข้อมูลคุณควรแปลงเป็นข้อมูลลอย เช่น:

$dataf=unpack("f*", $data);
print_r($dataf);

ในกรณีที่โฮสต์ของคุณไม่รองรับการอัปโหลดไฟล์ขนาดใหญ่คุณสามารถแบ่งไฟล์ bip ของคุณเป็น 8 ไฟล์ bip

ข้อมูลเพิ่มเติมเกี่ยวกับวิธีที่ฉันจะทำส่วนที่เหลือของเว็บไซต์: เนื่องจากข้อมูลของคุณเป็นแบบคงที่คุณสามารถสร้างผู้ดูแผนที่ขนาดเล็กโดยใช้ gdal2tiles และ openlayers http://www.gdal.org/gdal2tiles.html อันที่จริงแล้วเนื่องจากคุณพูดว่า "ฉันไม่ต้องการความยืดหยุ่นในการปรับขนาด - โครงการนี้ส่วนใหญ่จะช่วยให้นักวิจัยที่เป็นนักเพียร์บางคนสามารถเข้าถึงข้อมูลของฉันได้ง่ายกว่าการส่ง 8GB ไฟล์และโหลดใน ENVI "คุณสามารถทำได้โดยไม่ต้องใช้กล่องเครื่องมือ webgis: เพียงให้ผู้ใช้คลิกที่ภาพและจับพิกัด: http://www.emanueleferonato.com/2006/09/02/click -image และได้รับพิกัดที่มีจาวาสคริปต์ /

(แต่คุณควรหาวิธีนำเสนอภาพขนาด 5000x5000 ของคุณอย่างสวยงาม)


เยี่ยมมากนี่เป็นคำอธิบายที่เป็นประโยชน์จริงๆ การติดตามหนึ่งรายการ: ฉันควรเก็บไบนารีนี้ไว้ใน PostGIS หรือไม่ ฉันแค่ต้องการหลีกเลี่ยงสถานการณ์ที่เซิร์ฟเวอร์ต้องดึงไฟล์ไบนารีทั้งหมดออกจากฐานข้อมูลก่อนที่จะทำการสืบค้นด้วย PHP หรือ Python นั่นจะเป็นขั้นตอนที่ช้าอย่างเด็ดขาด
dmahr

ไม่ไฟล์ควรอยู่ในระบบไฟล์ ไม่มีจุดในการใช้ฐานข้อมูล แม้เพียงแค่เปิดการเชื่อมต่ออาจใช้เวลามากกว่าโค้ดด้านบน
johanvdw

7

ดูเหมือนว่าจะมีปัญหาแยกกันสามประเด็น: หนึ่งในโครงสร้างพื้นฐานหนึ่งในสถาปัตยกรรมและหนึ่งในการจัดการเหตุการณ์ ฉันจะจัดทำแนวทางหนึ่งที่เป็นไปได้ แต่คำตอบของฉันจำเป็นต้องเป็นเรื่องทั่วไป

โครงสร้างพื้นฐาน

ฉันแนะนำให้ใช้บริการโฮสติ้ง VPS เช่น Linode (www.linode.com) สำหรับเซิร์ฟเวอร์ของคุณ สิ่งนี้จะช่วยให้คุณสามารถเข้าถึงเซิร์ฟเวอร์ที่ได้รับการดูแลอย่างมืออาชีพได้อย่างเต็มที่โดยไม่ต้องกังวลว่ากำลังจะหมดหรือขาดการเชื่อมต่อกับอินเทอร์เน็ต

สถาปัตยกรรม

มีตัวเลือกมากมายที่นี่ที่สามารถครอบงำอย่างแท้จริง ตัวอย่างเช่นฉันใช้สองระบบกับ GeoServer และ OpenLayers GeoServer ให้บริการโดย Tomcat 7 ส่วนหน้าของ OpenLayers / jQuery เสิร์ฟโดย Apache2 คุณสามารถรวม Postgres / PostGIS สำหรับจัดเก็บข้อมูลเวคเตอร์ แต่นี่ไม่ใช่ตัวเลือกที่ดีสำหรับข้อมูลแรสเตอร์ คุณสามารถตั้งค่าระบบ Python โดยใช้ Django หรือแม้แต่ web.py (http://webpy.org/) สำหรับคอนโทรลเลอร์ที่ค่อนข้างง่าย GeoServer ให้คุณจัดเก็บข้อมูลแรสเตอร์ในรูปแบบต่อไปนี้:

  • ArcGrid - รูปแบบการครอบคลุม Arc Grid
  • GeoTIFF - รูปแบบไฟล์ภาพที่ติดแท็กด้วยข้อมูลทางภูมิศาสตร์
  • Gtopo30 - รูปแบบความคุ้มครอง Gtopo30
  • ImageMosaic - ปลั๊กอินภาพโมเสส
  • WorldImage - ไฟล์แรสเตอร์พร้อมกับไฟล์ข้อมูลเชิงพื้นที่

การจัดการเหตุการณ์

เมื่อผู้ใช้คลิกบนแผนที่ที่คุณต้องการที่จะปรากฏขึ้นพล็อตอนุกรมเวลาของข้อมูลฟิลด์ที่จุดนั้น ก่อนอื่นให้ตั้งค่าคอนโทรลเลอร์ซึ่งสามารถเขียนเป็น Python หรือ Java ซึ่งรับฟังคำขอ URL ด้วยละติจูดและลองจิจูด คอนโทรลเลอร์นี้ส่งคืนอิมเมจแบบสแตติกที่เรนเดอร์บนเซิร์ฟเวอร์หรือข้อมูล json ที่ไคลเอ็นต์ (jQuery) สามารถเปลี่ยนเป็นพล็อตได้

ถัดไปเพื่อรับข้อมูล XY บนแผนที่คุณอาจใช้ฟังก์ชันเช่นนี้ (ดูhttp://dev.openlayers.org/releases/OpenLayers-2.11/examples/click-handler.html ):

onClick: function(evt) {
    var clickSpot = evt.xy;
    // pass clickSpot to the controller ...
}

ฉันหวังว่าจะช่วย


ขอบคุณสำหรับการเขียน! คุณเคยใช้รูปแบบไฟล์เหล่านี้ในการทำแรสเตอร์สามมิติที่มีขนาดมากกว่า 8GB หรือไม่? ฉันรู้ว่า GeoTIFF ต้องมีขนาดไม่เกิน 4GB และซอฟต์แวร์เซิร์ฟเวอร์จะสามารถสืบค้นชุดข้อมูลแกนเวลา z ได้อย่างมีประสิทธิภาพหรือไม่
dmahr

ลองดูที่ปิรามิดภาพ ที่อาจช่วยแก้ไขปัญหาเรื่องขนาดไฟล์ เมื่อจัดการเหตุการณ์คลิกรหัสของคุณ (คอนโทรลเลอร์) จะได้รับข้อมูล XY จากนั้นค้นหาและแยกค่า z จากแต่ละภาพบันทึกเวลา 300 ภาพ นั่นคือการประมวลผลและดิสก์ IO จำนวนมากดังนั้นอาจใช้เวลานาน หากวิธีการ "บังคับเดรัจฉาน" นั้นใช้เวลานานเกินไปคุณสามารถดูอัลกอริธึมสำรองและ / หรือโครงร่างหน่วยเก็บข้อมูลอนุกรมเวลา
katahdin

ใช่ว่าวิธี "กำลังดุร้าย" จะช้ากว่าที่ฉันต้องการ (มันยิ่งช้ากว่าคอมพิวเตอร์เดสก์ท็อป) ฉันเดาว่าฉันสนใจที่จะกำหนดกรอบการบริการการทำแผนที่เว็บทั้งหมดให้ดีที่สุดสำหรับพื้นที่เก็บข้อมูลสำรองที่ฉันสามารถหาได้
dmahr

1

ถ้าผมเข้าใจอย่างถูกต้องคำถามของคุณฉันจะสร้างบริการเวลา WMS, เช่นกับ MapServer

วิธีนี้จะเป็นการง่ายที่จะแสดงแรสเตอร์ที่ถูกต้องสำหรับแต่ละวันที่ (ด้วยคำขอ GetMap) และขอค่าสำหรับเซลล์ในช่วงวันที่และเวลาที่กำหนด (พร้อมกับคำขอ GetFeatureInfo

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.