Phần mềm lập bản đồ web cho một chuỗi thời gian raster khổng lồ?


11

Tôi là người dùng ArcGIS Desktop lần đầu tiên bước chân vào thế giới lập bản đồ web. Theo lời khuyên tôi tìm thấy ở đây trên GIS.SE, tôi bắt đầu với các hướng dẫn miễn phí từ OpenGeo .

Tuy nhiên, tôi bắt đầu nhận ra rằng hầu hết các bản demo và ví dụ đều hướng đến dữ liệu vectơ. Dự án chính của tôi liên quan đến việc hiển thị chuỗi thời gian 300 khung hình 5000 r 5000 pixel. Trên máy tính để bàn của tôi, những thứ này được lưu trữ trong một nhị phân BIP số nguyên 5000x5000x300 16 bit, tổng cộng khoảng 8GB. Mục tiêu của tôi là có thể nhấp vào một ô (của một raster duy nhất trong chuỗi thời gian) và có một biểu đồ bật lên hiển thị các giá trị của pixel đó trong chuỗi thời gian 300 phần tử. Dữ liệu raster được sử dụng cho mỗi biểu đồ chuỗi thời gian phải được lưu trữ một cách dễ dàng, mặc dù các bản đồ lớp phủ được nhấp vào có thể là bộ nhớ cache bị mất.

Có bất cứ điều gì có thể phù hợp hơn cho dự án này (cho một nhà phát triển web người mới làm quen) so với OpenGeo không? Hay tôi chỉ nên tiếp tục với thiết lập này?

Để tham khảo, tôi có kinh nghiệm lập trình về Python, Java và PHP. Tôi không có nhiều kinh nghiệm với SQL. Đây là một dự án kết thúc mở nên tôi có nhiều thời gian để học các ngôn ngữ mới nếu cần. Tôi đã có một máy chủ web, mặc dù có lẽ tôi sẽ phải chuyển đổi máy chủ vì GoDaddy dường như không hỗ trợ PostgreQuery mà không nhận được VPS.

Cảm ơn bạn đã giúp đỡ!

EDIT: (ngày 13 tháng 1) Tôi vẫn đang tìm kiếm thông tin về chính xác cách tốt nhất để lưu trữ raster BIP số nguyên 16 bit và có thể truy vấn hiệu quả một "cột" dữ liệu trục z duy nhất. Tôi không muốn chuyển đổi nó sang định dạng 32 bit (vì điều đó sẽ tăng gấp đôi kích thước tệp của nó từ dạng 16 bit hiện tại).


2
Bạn có thể đặt PostgreSQL / PostGIS trên Máy chủ web của bạn không? - Rất muốn có máy chủ của riêng bạn trừ khi bạn tìm kiếm các tùy chọn có thể mở rộng thì Amazon AWS (Cơ sở dữ liệu quan hệ EC2 AMI) aws.amazon.com/rasty_database có thể là một tùy chọn.
Mapperz

1
Máy chủ của tôi (GoDaddy) không hỗ trợ PostgreSQL theo chủ đề này . Tôi thực sự không cần khả năng mở rộng - dự án này chủ yếu là để cho phép một vài nhà nghiên cứu ngang hàng truy cập dễ dàng hơn vào dữ liệu của tôi hơn là gửi tệp 8GB và tải nó trong ENVI.
dmahr

1
Nếu bạn đang xem xét một máy chủ mới, tôi không thể đề xuất tính năng web đủ cao; họ cung cấp postgresql / postgis1.5 nhưng đối với chức năng raster bạn có thể muốn postgis2.0. Đây là trên chia sẻ lưu trữ quá.
djq

Câu trả lời:


6

EDIT: (ngày 13 tháng 1) Tôi vẫn đang tìm kiếm thông tin về chính xác cách tốt nhất để lưu trữ raster BIP số nguyên 16 bit và có thể truy vấn hiệu quả một "cột" dữ liệu trục z duy nhất. Tôi không muốn chuyển đổi nó sang định dạng 32 bit (vì điều đó sẽ tăng gấp đôi kích thước tệp của nó từ dạng 16 bit hiện tại).

Truy vấn raster như vậy không thực sự gây ra vấn đề lớn. Bạn có thể đọc dữ liệu nhị phân trực tiếp bằng tất cả các ngôn ngữ chương trình và truy cập nhanh. Chỉ cần đảm bảo rằng bạn lưu trữ dữ liệu của mình ở định dạng tệp có tất cả siêu dữ liệu trong một tệp riêng biệt. BIP là một định dạng như vậy

ví dụ: trong php, giả sử rằng tệp là thứ tự chính hàng (nếu không thì chuyển x và y), với $ x và $ y vị trí trong lưới của bạn (tính từ 0), $ nx, $ ny và $ nz số pixel trong mỗi thứ nguyên và $ nb số byte trên mỗi lưới:

$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

Chỉ cần đảm bảo rằng bạn truy cập pixel bên phải: việc đếm bắt đầu từ trên cùng bên trái hay không, ...

Một số thông tin bổ sung: Sau khi đọc dữ liệu, bạn nên chuyển đổi nó thành float. Ví dụ:

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

Trong trường hợp máy chủ của bạn không hỗ trợ tải lên các tệp lớn, bạn có thể chia nhỏ tệp bip của mình trong ví dụ 8 tệp bip.

Một số thông tin khác về cách tôi sẽ làm phần còn lại của trang web: vì dữ liệu của bạn là tĩnh, bạn có thể tạo một trình xem bản đồ nhỏ bằng cách sử dụng gdal2tiles và trình mở. http://www.gdal.org/gdal2tiles.html Trên thực tế, vì bạn nói rằng "Tôi không thực sự cần khả năng mở rộng - dự án này chủ yếu là cho phép một vài nhà nghiên cứu ngang hàng truy cập dễ dàng hơn vào dữ liệu của tôi hơn là gửi một Tệp 8GB và tải nó trong ENVI. "Bạn thậm chí có thể làm mà không cần sử dụng hộp công cụ webgis: chỉ cần cho phép người dùng của bạn nhấp vào hình ảnh và bắt tọa độ: http://www.emanueleferonato.com/2006/09/02/click -image-and-get-tọa độ-với-javascript /

(mặc dù bạn nên tìm cách trình bày hình ảnh 5000x5000 của mình một cách độc đáo)


Tuyệt vời, đây là thực sự hữu ích làm rõ. Theo dõi: tôi có nên lưu trữ nhị phân này trong PostGIS không? Tôi chỉ muốn tránh tình huống máy chủ phải rút toàn bộ tệp nhị phân ra khỏi cơ sở dữ liệu trước khi truy vấn nó bằng PHP hoặc Python. Đó sẽ là một bước chậm nghiêm trọng.
dmahr

Không, tệp phải nằm trong hệ thống tệp. Không có điểm trong việc sử dụng một cơ sở dữ liệu. Thậm chí chỉ cần mở một kết nối có thể sẽ mất nhiều thời gian hơn mã ở trên.
johanvdw

7

Điều này trông giống như ba vấn đề riêng biệt: một về cơ sở hạ tầng, một về kiến ​​trúc và một về xử lý sự kiện. Tôi sẽ đưa ra một cách tiếp cận có thể, nhưng câu trả lời của tôi nhất thiết là chung chung.

Cơ sở hạ tầng

Tôi khuyên bạn nên sử dụng dịch vụ lưu trữ VPS như Linode (www.linode.com) cho máy chủ của bạn. Điều này cung cấp cho bạn quyền truy cập đầy đủ (tức là root) vào một máy chủ được bảo trì chuyên nghiệp - không phải lo lắng về việc mất điện hoặc mất kết nối với Internet.

Ngành kiến ​​trúc

Có rất nhiều lựa chọn ở đây mà nó có thể thực sự áp đảo. Ví dụ, tôi chạy một vài hệ thống với GeoServer và OpenLayers. GeoServer được phục vụ bởi Tomcat 7. Giao diện người dùng OpenLayers / jQuery được cung cấp bởi Apache2. Bạn có thể bao gồm Postgres / PostGIS để lưu trữ dữ liệu vectơ, nhưng đây không phải là một lựa chọn tốt cho dữ liệu raster. Bạn cũng có thể thiết lập một hệ thống Python bằng Django hoặc thậm chí web.py (http://webpy.org/) cho một bộ điều khiển khá đơn giản. GeoServer cho phép bạn lưu trữ dữ liệu raster theo các định dạng sau:

  • ArcGrid - Định dạng phủ sóng lưới Arc
  • GeoTIFF - Định dạng tệp hình ảnh được gắn thẻ với thông tin địa lý
  • Định dạng bảo hiểm Gtopo30 - Gtopo30
  • ImageMosaic - Plugin ghép hình ảnh
  • WorldImage - Một tệp raster kèm theo tệp dữ liệu không gian

Xử lý sự kiện

Khi người dùng nhấp vào bản đồ, bạn muốn bật lên một chuỗi thời gian của dữ liệu trường tại thời điểm đó. Đầu tiên, thiết lập một bộ điều khiển, có thể được viết bằng Python hoặc Java, lắng nghe các yêu cầu url với vĩ độ và kinh độ. Bộ điều khiển này trả về một hình ảnh tĩnh được hiển thị trên máy chủ hoặc dữ liệu json mà máy khách (jQuery) có thể biến thành một âm mưu.

Tiếp theo, để lấy dữ liệu XY trên bản đồ, bạn có thể sử dụng một chức năng như thế này (xem http://dev.openlayers.org/release/OpenLayers-2.11/examples/click-handler.html ):

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

Tôi hy vọng điều đó sẽ giúp.


Cảm ơn đã viết lên! Bạn đã bao giờ sử dụng bất kỳ định dạng tệp nào để thực hiện các trình quét ba chiều có kích thước trên 8GB chưa? Tôi biết rằng GeoTIFF không thể vượt quá 4GB chẳng hạn. Và phần mềm máy chủ có thể truy vấn hiệu quả một chuỗi dữ liệu thời gian trục z không?
dmahr

Hãy nhìn vào kim tự tháp hình ảnh . Điều đó có thể giúp với các vấn đề kích thước tập tin. Khi xử lý sự kiện nhấp, mã của bạn (bộ điều khiển) sẽ nhận dữ liệu XY, sau đó tìm kiếm và trích xuất giá trị z từ mỗi trong số 300 hình ảnh được đánh dấu thời gian. Đó là rất nhiều xử lý và đĩa IO, vì vậy nó có thể mất một thời gian dài. Nếu phương pháp "brute force" đó mất quá nhiều thời gian thì bạn có thể xem xét các thuật toán thay thế và / hoặc các sơ đồ lưu trữ chuỗi thời gian.
katahdin

Vâng, phương pháp "brute force" sẽ chậm hơn tôi muốn (thậm chí nó còn chậm trên máy tính để bàn). Tôi đoán tôi quan tâm đến việc đóng khung toàn bộ dịch vụ lập bản đồ web xung quanh sơ đồ lưu trữ thay thế tốt nhất mà tôi có thể tìm thấy.
dmahr

1

Nếu tôi hiểu chính xác câu hỏi của bạn, tôi sẽ tạo một dịch vụ WMS thời gian, ví dụ như với MapServer .

Bằng cách này, bạn sẽ dễ dàng hiển thị raster chính xác cho mỗi datetime (với yêu cầu GetMap) và yêu cầu các giá trị cho một ô trong phạm vi datetime đã cho (với yêu cầu GetFeatureInfo).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.