Как очень эффективно назначить широту/долготу границе города, описанной формой?

У меня есть огромный шейп-файл из 36 000 непересекающихся полигонов (границы города). Я хочу легко определить полигон, в который попадает данная широта/долгота. Каков наилучший способ, учитывая, что он должен быть чрезвычайно эффективным в вычислительном отношении?

Я думал о создании справочной таблицы (tilex,tiley,polygone_id), где tilex и tiley являются идентификаторами тайлов на уровнях масштабирования 21 или 22. Да, в моем приложении приемлема неточность использования номеров тайлов и планарной проекции.

Я бы предпочел не использовать ГИС-расширение postgres, и меня устраивает программа, которая будет работать в течение 2 дней, чтобы сгенерировать все операторы INSERT.


person Philippe Girolami    schedule 05.05.2010    source источник


Ответы (2)


Вставить утверждения во что? Вы используете другую пространственную базу данных или какую-то другую базу данных? Если вы хотите использовать python, C или Java, вы можете использовать shapely, GEOS или JTS, чтобы написать некоторый собственный код, чтобы делать то, что вы хотите, довольно просто.

В python используйте эту библиотеку, чтобы открыть шейп-файл http://indiemaps.com/blog/2008/03/easy-shapefile-loading-in-python/

затем красиво http://gispython.org/shapely/docs/1.0/manual.html#contains для проверки сдерживания

Для Java используйте Geotools, который также включает JTS.

person TheSteve0    schedule 06.05.2010
comment
JTS — это то, что я искал вместе с его способностью делать «точку в полигоне». - person Philippe Girolami; 08.05.2010
comment
Вернемся к этому намного позже... после долгих проб, ошибок и решений мы остановились на postgres/postgis, который позволяет загружать шейп-файл в базу данных и делать всевозможные изящные вещи. Мы запускаем его на 16-ядерной машине при 100% загрузке. - person Philippe Girolami; 18.04.2012
comment
Да, это отличное решение, которое поможет вам написать весь код самостоятельно. Обязательно подумайте о переходе на PostGIS 2.0 — там много улучшений. - person TheSteve0; 18.04.2012

Похоже, вам нужно дерево BSP. По сути, вы делите область на меньшие и меньшие полигоны в виде дерева.

Преимущество в том, что вам не нужно потом сравнивать координаты с каждым полигоном. Это позволяет очень быстро найти правильный многоугольник.

person bitc    schedule 05.05.2010