Получить информацию из файла данных карты по координатам

Представьте, что у меня есть файл формы карты (.shp) или osm xml, я могу видеть разные типы данных из разных слоев в программах, ориентированных на ГИС, например ArcGIS, QGIS и т. Д. Но как я могу получить эту информацию программно? Есть ли для этого специальная библиотека? То, что я действительно ищу, - это какой-то метод getMapData (долгота, широта) для получения информации о ландшафте / местности (например, лес, река, город, шоссе) в указанном месте.

Заранее благодарим за ответы!


person kmityak    schedule 13.12.2011    source источник


Ответы (3)


Все еще зависит от того, чего вы хотите достичь, лучше ли вам использовать растровые или векторные данные.

Если вы используете сетку для разделения области на массив контейнеров для географических объектов, то придерживайтесь векторных данных. Для этого я бы создал файл многоугольной сетки и пересек бы его с каждым из ваших слоев данных. Затем вы можете добавить поле идентификатора, которое представляет местоположение ячейки в массиве (и, следовательно, ее относительное положение по отношению к известной координате широты / долготы - скажем, в нижнем левом углу). В качестве альтернативы вы можете использовать пространственные запросы для доступа к своим данным, выбрав многоугольник в файле векторной сетки и затем найдя все объекты в другом файле, которые в нем содержатся.

OTOH, если вы хотите провести мультифункциональный анализ на основе присутствия / отсутствия, тогда вам может быть лучше пойти по маршруту растрового анализа. На основании того, что вы сказали, я чувствую, что это то, чего вы пытаетесь достичь, но я все еще не уверен на 100%. Вы можете справиться с этим, создав набор логических растров подходящего разрешения, а затем выполнив математические операции над набором (сложение, вычитание, среднее значение и т. Д. - в зависимости от того, какие вопросы вы задаете).

Допустим, вы изучаете миграцию животных. Допустим, ваша модель предполагает, что ручьи, изгороди и города - все препятствия для миграции, но дороги только уменьшают вероятность пересечения территории. Таким образом, вы преобразуете свои препятствия в значение «1» и NoData в «0» в каждом случае, кроме дорог, для которых вы решили установить значение 0,5. Затем вы можете сложить все свои растры в один большой стек и спрогнозировать маршруты миграции.

Хорошо, это упрощенный пример, но, возможно, вы понимаете, почему нам нужно ДАЖЕ больше информации о том, что вы хотите сделать.

person MappaGnosis    schedule 21.12.2011
comment
Что ж, ваш пример очень близок к моей задаче в целом. Я собираюсь решить проблему распространения лесных пожаров, но в этом случае мне также нужно будет получить информацию о препятствиях и, конечно же, о лесах. Почему я не хочу использовать растр, потому что с векторными данными моя модель будет более гибкой для некоторых изменений точности или карты вообще, и мне не придется снова преобразовывать вектор в растр. Вот и все. - person kmityak; 22.12.2011
comment
Это классическое приложение ГИС, и есть множество примеров, которые могут вам пригодиться (например, esri.com/library/brochures/pdfs/wildland-fire-suppression.pdf). - person MappaGnosis; 22.12.2011
comment
{извините, нажал 'ENTER слишком рано!} Векторы отлично подходят для дискретной информации, а растры лучше для непрерывных данных (например, количество осадков, скорость ветра и воспламеняемость областей на фронте пожара). Ваши пределы точности влияют только на расстояние, на которое огонь может «прыгнуть». Таким образом, расчеты растра с подходящим разрешением НАМНОГО проще и вполне приемлемы. Векторные данные могут значительно усложнить вычисления и получить сомнительные результаты. Большинство других известных мне моделей лесных пожаров используют растровый анализ, и у ESRI есть несколько отличных примеров. - person MappaGnosis; 22.12.2011

Шейп-файлы или XML-файл osm - это просто контейнеры, содержащие геометрические фигуры. Существует множество программных библиотек, которые позволяют читать эти файлы и извлекать данные. Я бы рекомендовал изучить GDAL / OGR в качестве отправной точки.

Такой метод, как getMapData (longitude, latitude), по сути, является функцией поиска / запроса. Вам также нужно быть более конкретным, вы хотите, чтобы геометрия содержала точку, находилась на расстоянии от точки и т. Д.?

Вы можете найти данные карты, используя алгоритм грубой силы

for shape in shapefile:
    if shape.contains(query_point):
        return shape

Или вы можете использовать более продвинутые алгоритмы / структуры данных, такие как RTrees, KDTrees, QuadTrees и т. Д. Самый простой способ начать запрашивать данные карты - это загрузить их в пространственную базу данных. Я бы порекомендовал изучить PostgreSQL + PostGIS и SpatiaLite

person Charles    schedule 15.12.2011
comment
Спасибо за советы. На самом деле я собираюсь решить некоторую научную задачу, которая требует такой информации для создания внутренней базы данных препятствий (она также будет включать информацию о погоде и высоте). Я хочу создать сетку определенной области, каждая ячейка сетки будет хранить некоторые данные объекта карты, которые будут содержать информацию о гео-координатах, типе ландшафта, погоде, высоте и так далее. Подскажите, пожалуйста, те программы, которые вы предложили, могут помочь мне в достижении моей цели? - person kmityak; 18.12.2011
comment
Да, эти программы - хорошее начало, но похоже, они позволят вам лучше определить вашу проблему. - person Charles; 21.12.2011

Вы также можете посмотреть Spatialite и / или PostGIS, которые представляют собой две пространственные базы данных, которые можно использовать отдельно или вместе с GDAL / OGR.

Я должен повторить просьбу Чарльза о том, чтобы вы объяснили свой вариант использования более подробно, потому что фактическая реализация будет во многом зависеть от того, чего именно вы хотите достичь. Я считаю, что вы можете преобразовать свои данные в серию выровненных растров, которые вы можете наложить и рассматривать как трехмерный массив.

person MappaGnosis    schedule 21.12.2011
comment
Да, ищу решение для конвертации, чтобы данные приводились в максимально удобном виде. На самом деле это может быть двухмерный массив с широтой и долготой в качестве размеров (конечно, с заданной точностью). Я уже нашел карты и слои нужной мне области в формате формы, и единственное, что осталось на этом этапе, - это научиться работать с этими данными. Я могу преобразовать векторные данные в растровые, но я предполагаю, что будет лучше знать, как работать с векторными данными напрямую. Надеюсь, теперь мое объяснение выглядит более ясным. - person kmityak; 21.12.2011