Oprogramowanie do mapowania sieci dla ogromnej serii czasu rastrowego?

11

Jestem użytkownikiem ArcGIS Desktop, który po raz pierwszy wkracza w świat mapowania stron internetowych. Zgodnie z radą, którą znalazłem tutaj na GIS.SE, zacząłem od bezpłatnych samouczków od OpenGeo .

Jednak zacząłem zdawać sobie sprawę, że większość demonstracji i przykładów dotyczyła danych wektorowych. Mój główny projekt polega na wyświetleniu 300 klatek serii czasowej 5000 x 5000 pikseli rastrów. Na moim komputerze stacjonarnym są one przechowywane w jednym 16-bitowym pliku BIP o całkowitej liczbie 5000 x 5000 x 300, który wynosi około 8 GB. Moim celem jest możliwość kliknięcia komórki (pojedynczego rastra w szeregu czasowym) i wyświetlenia wykresu pokazującego wartości tego piksela w 300-elementowym szeregu czasowym. Dane rastrowe używane dla każdego wykresu szeregów czasowych muszą być przechowywane bezstratnie, chociaż klikane mapy nakładek mogą być stratnymi pamięciami podręcznymi.

Czy jest coś, co może być bardziej odpowiednie dla tego projektu (dla początkującego programisty internetowego GIS) niż OpenGeo? A może powinienem kontynuować konfigurację?

Dla porównania mam doświadczenie w programowaniu w języku Python, Java i PHP. Nie mam dużego doświadczenia z SQL. Jest to projekt otwarty, więc w razie potrzeby mam dużo czasu na naukę nowych języków. Mam już serwer WWW, chociaż prawdopodobnie będę musiał zmienić hosty, ponieważ GoDaddy nie obsługuje PostgreSQL bez uzyskania VPS.

Dzięki za pomoc!

EDYCJA: (13 stycznia) Wciąż szukam informacji o tym, jak najlepiej przechowywać trójwymiarowy 16-bitowy raster BIP w liczbach całkowitych i móc skutecznie wyszukiwać pojedynczą „kolumnę” danych w osi Z. Nie chcę konwertować go do formatu 32-bitowego (ponieważ podwoiłoby to jego rozmiar pliku w porównaniu z obecną 16-bitową formą).

dmahr
źródło
2
Czy umieścisz PostgreSQL / PostGIS na swoim serwerze? - Zdecydowanie zaleciłbym posiadanie własnego serwera, chyba że szukasz skalowalnych opcji, więc może być Amazon AWS (EC2 Relational Databases AMI) aws.amazon.com/running_databases .
Mapperz
1
Mój host (GoDaddy) nie obsługuje PostgreSQL zgodnie z tym wątkiem . Naprawdę nie potrzebuję skalowalności - ten projekt ma przede wszystkim umożliwić kilku badaczom łatwiejszy dostęp do moich danych niż wysyłanie pliku 8 GB i ładowanie go do ENVI.
dmahr
1
Jeśli zastanawiasz się nad nowym hostem, nie mogę wystarczająco polecić webfaction; oferują one postgresql / postgis1.5, ale dla funkcji rastrowej prawdopodobnie potrzebujesz postgis2.0. Dotyczy to również hostingu współdzielonego.
djq

Odpowiedzi:

6

EDYCJA: (13 stycznia) Wciąż szukam informacji o tym, jak najlepiej przechowywać trójwymiarowy 16-bitowy raster BIP w liczbach całkowitych i móc skutecznie wyszukiwać pojedynczą „kolumnę” danych w osi Z. Nie chcę konwertować go do formatu 32-bitowego (ponieważ podwoiłoby to jego rozmiar pliku w porównaniu z obecną 16-bitową formą).

Zapytanie o taki raster nie powinno tak naprawdę stanowić dużego problemu. Możesz odczytywać dane binarne bezpośrednio przy użyciu wszystkich języków programu, a dostęp jest szybki. Upewnij się tylko, że przechowujesz swoje dane w formacie pliku, który zawiera wszystkie metadane w osobnym pliku. BIP jest takim formatem

np. w php, przy założeniu, że plik ma porządek główny rzędu (w przeciwnym razie przełącza xiy), gdzie $ x i $ y pozycja w twojej siatce (licząc od 0), $ nx, $ ny i $ nz liczba pikseli w każdy wymiar i $ nb liczba bajtów na komórkę siatki:

$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

Tylko upewnij się, że masz dostęp do prawego piksela: czy liczenie zaczyna się od lewego górnego rogu, czy nie, ...

Kilka dodatkowych informacji: po odczytaniu danych należy przekonwertować je na zmiennoprzecinkowe. Na przykład:

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

Jeśli Twój host nie obsługuje przesyłania dużych plików, możesz np. Podzielić plik bip na np. 8 plików bip.

Więcej informacji o tym, jak zrobiłbym resztę strony: ponieważ twoje dane są statyczne, możesz wygenerować mały przeglądarkę map za pomocą gdal2tiles i openlayers. http://www.gdal.org/gdal2tiles.html W rzeczywistości, ponieważ powiedziałeś: „Naprawdę nie potrzebuję skalowalności - ten projekt ma głównie umożliwić kilku innym badaczom łatwiejszy dostęp do moich danych niż wysyłanie 8 GB pliku i ładowanie go w ENVI. ”Możesz zrobić nawet bez użycia przybornika webgis: pozwól użytkownikom kliknąć obraz i złapać współrzędne: http://www.emanueleferonato.com/2006/09/02/click -image-and-get-coordinates-with-javascript /

(chociaż powinieneś znaleźć sposób na ładną prezentację swojego obrazu 5000x5000)

johanvdw
źródło
Świetnie, to naprawdę pomocne wyjaśnienie. Jedna kontynuacja: czy powinienem przechowywać ten plik binarny w PostGIS? Chcę tylko uniknąć sytuacji, w której serwer musi wyciągnąć cały plik binarny z bazy danych przed wysłaniem zapytania za pomocą PHP lub Pythona. To byłby zbyt wolny krok.
dmahr
Nie, plik powinien znajdować się w systemie plików. Nie ma sensu korzystać z bazy danych. Nawet samo otwarcie połączenia prawdopodobnie zajmie więcej czasu niż powyższy kod.
johanvdw
7

Wygląda to na trzy osobne kwestie: jedną dotyczącą infrastruktury, jedną dotyczącą architektury i jedną dotyczącą obsługi zdarzeń. Przedstawię jedno możliwe podejście, ale moja odpowiedź jest z konieczności ogólna.

Infrastruktura

Polecam korzystanie z usługi hostingowej VPS, takiej jak Linode (www.linode.com) dla twojego serwera. Zapewnia to pełny (tzn. Root) dostęp do profesjonalnie utrzymywanego serwera - bez obaw o brak zasilania lub utratę połączenia z Internetem.

Architektura

Jest tu tak wiele opcji, że może być naprawdę przytłaczająca. Jako przykład uruchamiam kilka systemów z GeoServer i OpenLayers. GeoServer jest obsługiwany przez Tomcat 7. Interfejs OpenLayers / jQuery jest obsługiwany przez Apache2. Możesz dołączyć Postgres / PostGIS do przechowywania danych wektorowych, ale nie jest to dobra opcja dla danych rastrowych. Możesz również skonfigurować system Python za pomocą Django lub nawet web.py (http://webpy.org/) dla raczej prostego kontrolera. GeoServer pozwala przechowywać dane rastrowe w następujących formatach:

  • ArcGrid - Format pokrycia siatki
  • GeoTIFF - Tagged Image File Format z informacjami geograficznymi
  • Gtopo30 - Format pokrycia Gtopo30
  • ImageMosaic - Wtyczka mozaikowania obrazu
  • WorldImage - plik rastrowy, któremu towarzyszy plik danych przestrzennych

Obsługa zdarzeń

Gdy użytkownik kliknie mapę, w tym momencie chcesz wyświetlić wykres szeregów czasowych danych pola. Najpierw skonfiguruj kontroler, który może być napisany w Pythonie lub Javie, który nasłuchuje żądań adresów URL z szerokością i długością geograficzną. Ten kontroler zwraca albo statyczny obraz renderowany na serwerze, albo dane json, które klient (jQuery) może przekształcić w wykres.

Następnie, aby pobrać dane XY na mapę, możesz użyć funkcji takiej jak ta (patrz http://dev.openlayers.org/releases/OpenLayers-2.11/examples/click-handler.html ):

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

Mam nadzieję że to pomogło.

katahdin
źródło
Dziękuję za napisanie! Czy kiedykolwiek używałeś któregoś z tych formatów plików, aby tworzyć trójwymiarowe rastry o wielkości ponad 8 GB? Wiem, że GeoTIFF nie może na przykład przekroczyć 4 GB. Czy oprogramowanie serwera będzie w stanie efektywnie przeszukiwać pojedyncze serie czasowe danych osi Z?
dmahr
Spójrz na piramidy obrazkowe . Może to pomóc w problemach z rozmiarem pliku. Podczas obsługi zdarzenia kliknięcia Twój kod (kontroler) otrzyma dane XY, a następnie wyszuka i wyodrębni wartość Z z każdego z 300 obrazów ze znacznikiem czasu. To dużo przetwarzania i operacji dyskowych, więc może to zająć dużo czasu. Jeśli ta metoda „brutalnej siły” trwa zbyt długo, możesz przyjrzeć się alternatywnym algorytmom i / lub schematom przechowywania szeregów czasowych.
katahdin
Tak, ta metoda „brutalnej siły” będzie wolniejsza niż wolałbym (nawet wolniejsza na komputerze stacjonarnym). Chyba jestem zainteresowany otoczeniem całej usługi mapowania sieci wokół najlepszego alternatywnego schematu przechowywania, jaki mogę znaleźć.
dmahr
1

Jeśli dobrze zrozumiem twoje pytanie, utworzę usługę WMS na czas, na przykład za pomocą MapServer .

W ten sposób będzie łatwo wyświetlić prawidłowy raster dla każdej daty i godziny (z żądaniem GetMap) i zażądać wartości dla komórki w danym zakresie dat (z żądaniem GetFeatureInfo).

capooti
źródło