Програмне забезпечення для веб-картування для величезного растрового часового ряду?


11

Я користувач ArcGIS Desktop, який вперше вступає у світ веб-карт. Дотримуючись поради, яку я знайшов тут на GIS.SE, я почав з безкоштовних підручників від OpenGeo .

Однак я почав розуміти, що більшість демонстрацій та прикладів орієнтовані на векторні дані. Мій головний проект передбачає показ 300 кадрів часового ряду в 5000 х 5000 пікселів. На моєму настільному комп’ютері вони зберігаються в єдиному 16-бітовому бінарному BIP-файлі 5000x5000x300, що становить близько 8 ГБ. Моя мета - мати можливість натиснути на клітинку (одного растрового у часовому ряду) і створити графік, що показує значення цього пікселя у часовому ряду 300 елементів. Растрові дані, що використовуються для кожного графіку часових рядів, повинні зберігатися без втрат, хоча накладні карти, на які натискають, можуть бути кешами з втратами.

Чи є щось, що може бути краще підходить для цього проекту (для початківця веб-розробника ГІС), ніж OpenGeo? Або мені просто продовжувати цю установку?

Для довідки, у мене є досвід програмування в Python, Java та PHP. У мене немає великого досвіду роботи з SQL. Це відкритий проект, тому у мене є достатньо часу, щоб вивчити нові мови, якщо потрібно. У мене вже є веб-сервер, хоча, мабуть, доведеться перемикати хости, оскільки, схоже, GoDaddy не підтримує PostgreSQL без отримання VPS.

Спасибі за вашу допомогу!

EDIT: (13 січня) Я все ще шукаю інформацію про те, як найкраще зберігати тривимірний 16-бітовий цілочисельний растр BIP і мати можливість ефективно запитувати один "стовпець" даних з осі z-осі. Я не хочу конвертувати його у 32-розрядний формат (тому що це би подвоїло його розмір файлу у порівнянні з його теперішньою 16-бітною формою).


2
Чи можете ви розмістити PostgreSQL / PostGIS на своєму веб-сервері? - Настійно рекомендую мати власний сервер для, якщо ви не шукаєте масштабованих варіантів, тоді Amazon AWS (реляційні бази даних EC2 AMI) aws.amazon.com/running_databases може бути не варіантом.
Mapperz

1
Мій хост (GoDaddy) не підтримує PostgreSQL відповідно до цієї теми . Мені не дуже потрібна масштабованість - цей проект здебільшого дає змогу декільком однолітковим дослідникам мати легший доступ до моїх даних, ніж надсилання файлу 8 ГБ та завантаження його в ENVI.
dmahr

1
Якщо ви розглядаєте новий хост, я не можу досить рекомендувати веб-фракцію; вони пропонують postgresql / postgis1.5, але для растрової функціональності ви, мабуть, хочете postgis2.0. Це також на спільному хостингу.
djq

Відповіді:


6

EDIT: (13 січня) Я все ще шукаю інформацію про те, як найкраще зберігати тривимірний 16-бітовий цілочисельний растр BIP та мати можливість ефективно запитувати один "стовпець" даних з осі 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 файлів.

Ще кілька відомостей про те, як я буду робити решту веб-сайту: оскільки ваші дані статичні, ви можете створити невеликий переглядач карт за допомогою gdal2tiles та openlayers. http://www.gdal.org/gdal2tiles.html Насправді, оскільки ви говорите, що "мені дійсно не потрібна масштабованість - цей проект здебільшого дає змогу декільком одноранговим дослідникам мати легший доступ до моїх даних, ніж надсилання 8 Гб файл і завантажуючи його в ENVI. "Ви можете навіть зробити це без використання веб-інструментів: просто дозвольте вашим користувачам натиснути на зображення та вловити координати: http://www.emanueleferonato.com/2006/09/02/click -імідж-і-отримання координат-з-JavaScript /

(хоча ви повинні знайти спосіб красиво представити своє зображення 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 - Формат покриття дугової сітки
  • 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 ...
}

Я сподіваюся, що це допомагає.


Дякуємо за запис Ви коли-небудь використовували будь-який із цих форматів файлів, щоб робити тривимірні растри розміром понад 8 ГБ? Я знаю, що GeoTIFF, наприклад, не може перевищувати 4 Гб. І чи зможе серверне програмне забезпечення ефективно запитувати один часовий ряд даних по осі z?
dmahr

Погляньте на піраміди зображень . Це може допомогти з проблемами розміру файлу. Під час обробки події клацання ваш код (контролер) отримуватиме дані XY, а потім шукає та витягує z-значення з кожного із 300 зображень, розмічених за часом. Це багато обробки та дискового IO, тому це може зайняти тривалий час. Якщо цей метод "грубої сили" займає занадто багато часу, тоді ви можете розглянути альтернативні алгоритми та / або схеми зберігання часових рядів.
катахдін

Так, метод "грубої сили" буде повільнішим, ніж я вважаю за краще (навіть на настільному комп'ютері він навіть повільний). Напевно, мені цікаво створити всю службу веб-картографування навколо найкращої схеми альтернативного зберігання, яку я можу знайти.
dmahr

1

Якщо я правильно розумію ваше запитання, я створив би послугу WMS, наприклад, з MapServer .

Таким чином, буде легко відобразити правильний растр для кожної дати (із запитом GetMap) та запросити значення для комірки в заданому діапазоні часу (із запитом GetFeatureInfo).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.