Веб-картографическое программное обеспечение для огромных растровых временных рядов?

11

Я - пользователь ArcGIS Desktop, который впервые входит в мир веб-картографии. Следуя советам, которые я нашел здесь на GIS.SE, я начал с бесплатных руководств от OpenGeo .

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

Есть ли что-нибудь, что может лучше подходить для этого проекта (для начинающего веб-разработчика ГИС), чем OpenGeo? Или мне просто продолжать эту настройку?

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

Спасибо за вашу помощь!

РЕДАКТИРОВАТЬ: (13 января) Я все еще ищу информацию о том, как лучше всего хранить трехмерный 16-битный целочисленный растр BIP и иметь возможность эффективно запрашивать один «столбец» данных по оси z. Я не хочу преобразовывать его в 32-битный формат (потому что это удвоило бы размер его файла по сравнению с его текущей 16-битной формой).

dmahr
источник
2
Можете ли вы установить PostgreSQL / PostGIS на свой веб-сервер? - Настоятельно рекомендую иметь свой собственный сервер, если вы не ищете масштабируемые параметры, тогда Amazon AWS (реляционная база данных EC2 AMI) aws.amazon.com/running_databases может быть вариантом.
Mapperz
1
Мой хост (GoDaddy) не поддерживает PostgreSQL согласно этой теме . Мне действительно не нужна масштабируемость - этот проект в основном позволяет нескольким коллегам-исследователям иметь более простой доступ к моим данным, чем отправка файла 8 ГБ и загрузка его в ENVI.
dmahr
1
Если вы рассматриваете новый хостинг, я не могу рекомендовать webfaction достаточно высоко; они предлагают postgresql / postgis1.5, но для функциональности растра вы, вероятно, захотите postgis2.0. Это тоже на виртуальном хостинге.
DJQ

Ответы:

6

РЕДАКТИРОВАТЬ: (13 января) Я все еще ищу информацию о том, как лучше всего хранить трехмерный 16-битный целочисленный растр BIP и иметь возможность эффективно запрашивать один «столбец» данных по оси z. Я не хочу преобразовывать его в 32-битный формат (потому что это удвоило бы размер его файла по сравнению с его текущей 16-битной формой).

Запросы к такому растру не должны создавать больших проблем. Вы можете читать двоичные данные напрямую, используя все языки программы, и доступ к ним быстрый. Просто убедитесь, что вы храните свои данные в формате файла, который содержит все метаданные в отдельном файле. БИП это такой формат

например, в 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 Фактически, поскольку вы говорите, что «мне действительно не нужна масштабируемость - этот проект в основном позволяет нескольким коллегам-исследователям иметь более простой доступ к моим данным, чем отправка 8 ГБ файла и загрузите его в ENVI. "Вы могли бы даже обойтись без использования панели инструментов webgis: просто позвольте своим пользователям нажимать на изображение и узнавать координаты: http://www.emanueleferonato.com/2006/09/02/click -image-и-получить координаты-с-JavaScript /

(хотя вы должны найти способ красиво представить изображение 5000x5000)

johanvdw
источник
Круто, это действительно полезное разъяснение. Одно продолжение: я должен хранить этот двоичный файл в 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 ...
}

Надеюсь, это поможет.

Katahdin
источник
Спасибо, что написали! Вы когда-нибудь использовали какой-либо из этих форматов файлов для создания трехмерных растров размером более 8 ГБ? Я знаю, что GeoTIFF не может превышать 4 ГБ, например. И сможет ли серверное программное обеспечение эффективно запрашивать отдельные временные ряды по оси Z?
dmahr
Посмотрите на изображение пирамид . Это может помочь с проблемами размера файла. При обработке события щелчка ваш код (контроллер) будет получать данные XY, а затем искать и извлекать z-значение из каждого из 300 изображений с метками времени. Это много обработки и дискового ввода-вывода, так что это может занять много времени. Если этот метод "грубой силы" занимает слишком много времени, вы можете изучить альтернативные алгоритмы и / или схемы хранения временных рядов.
Катахдин
Да, этот метод "грубой силы" будет медленнее, чем я бы предпочел (он даже медленный на настольном компьютере). Я предполагаю, что мне интересно создать весь веб-картографический сервис вокруг лучшей альтернативной схемы хранения, которую я могу найти.
dmahr
1

Если я правильно понимаю ваш вопрос, я бы создал службу WMS времени, например, с MapServer .

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

capooti
источник