[Рецепт] Расчет охватов регионов РФ

Ответить
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

[Рецепт] Расчет охватов регионов РФ

Сообщение Denis Rykov » 14 окт 2009, 20:49

Решил сделать для сервиса http://gis-lab.info/projects/osm-errors.html возможность выбора регионов РФ. Очевидно, что эта задача равносильна определению охватов соответствующих областей. Как же поступить? Поскольку в PostGIS/PostgreSQL имелась БД с таблицей, импортированной из vmap0, то решил ею воспользоваться. Отмечу, что использовался слой vmap0 с убранными разделителями и исправленной атрибутикой, взятый когда-то отсюда. В таблице присутствует поле kladr_reg, содержащее название региона, к которому принадлежит тот или иной полигон, задачу усложняет то обстоятельство, что одному региону может принадлежать несколько полигонов (например, Красноярский край). Необходимый запрос имеет следующий вид:

Код: Выделить всё

select kladr_reg, AsText(ST_Transform(ST_Envelope(ST_UNION(the_geom)),900913)) from russia_bound group by kladr_reg;
Где:

AsText() - функция, возвращающая результат в формате WKT;
ST_Transform() - функция, трансформирующая геометрию из одной СК в другую (в нашем случае в 900913);
ST_Envelope() - функция, возвращающая ограничивающий прямоугольник;
ST_UNION() - агрегатная функция, объединяющая несколько геометрий в одну, позволяет использовать оператор GROUP BY, c помощью этой связки можно объединять и группировать геометрии по какому-либо полю, в нашем случае по полю kladr_reg.

Экспортируем полученный результат в html файл с помощью pgadmin (см. вложение). Получившиеся полигоны представлены 5 точками, нам же нужны только 1 и 3, после недолгих манипуляций в текстовом редакторе + OO Calc, получили необходимый результат:

Код: Выделить всё

Алтайский край 8660903.02052795,6556005.92007741,9707620.64496107,7263347.5582872
Амурская область 13321046.1183928,6249856.64565219,15023799.8254891,7768639.23017237
Архангельская область 3951362.4931338,8544634.37946939,5618324.56173557,10094463.2961228
Астраханская область 5006654.65353989,5648771.58629487,5517321.94651,6252829.71473425
...
P.S. Часто бывает необходимым просто перевести файл из проекции epsg:4326 в epsg:900913:

Код: Выделить всё

ogr2ogr -f "ESRI Shapefile" -t_srs "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs" -s_srs "EPSG:4326" output.shp input.shp
Надеюсь в будущем эта небольшая заметка кому-нибудь пригодится.
Вложения
regExtent.gif
regExtent.gif (48.4 КБ) 6875 просмотров
Последний раз редактировалось Denis Rykov 16 окт 2009, 05:50, всего редактировалось 2 раза.
Причина: добавил "Рецепт"
Spatial is now, more than ever, just another column- The Geometry Column.

Ezhick
Интересующийся
Сообщения: 38
Зарегистрирован: 15 окт 2009, 09:49
Репутация: 4

Re: [Рецепт] Расчет охватов регионов РФ

Сообщение Ezhick » 15 окт 2009, 09:52

Решаю похожую задачу, тоже для целей ОСМ. Только проблема в том, что в Постгис я совсем еще чайник :(

Суть задачи -построить геометрию типа multipolygon из геометрий типа linestring, то есть собрать в мультиполигон из релейшена границу, например, Москвы. Может кто-нить на примере показать, как имея кучу путей в виде геометрий linestring (формат WKB) собрать их в мультиполигон средствами postgis?

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: [Рецепт] Расчет охватов регионов РФ

Сообщение Denis Rykov » 15 окт 2009, 18:02

Ezhick, добро пожаловать на форум.

Вашу задачу можно решить, например, с помощью функции ST_BuildArea (описание). Вот небольшой пример.

Запрос вида:

Код: Выделить всё

SELECT ST_AsText(ST_BuildArea(ST_Collect(ST_GeomFromText('MULTILINESTRING((0 0,10 0, 10 20),(0 0,0 20, 10 20),(100 100,200 100, 200 50),(100 100,200 50))'))))
возвращает:

Код: Выделить всё

MULTIPOLYGON(((10 20,10 0,0 0,0 20,10 20)),((100 100,200 100,200 50,100 100)))
Spatial is now, more than ever, just another column- The Geometry Column.

Ezhick
Интересующийся
Сообщения: 38
Зарегистрирован: 15 окт 2009, 09:49
Репутация: 4

Re: [Рецепт] Расчет охватов регионов РФ

Сообщение Ezhick » 15 окт 2009, 18:17

_DR_ писал(а):Ezhick, добро пожаловать на форум.

Вашу задачу можно решить, например, с помощью функции ST_BuildArea (описание). Вот небольшой пример.

Запрос вида:

Код: Выделить всё

SELECT ST_AsText(ST_BuildArea(ST_Collect(ST_GeomFromText('MULTILINESTRING((0 0,10 0, 10 20),(0 0,0 20, 10 20),(100 100,200 100, 200 50),(100 100,200 50))'))))
возвращает:

Код: Выделить всё

MULTIPOLYGON(((10 20,10 0,0 0,0 20,10 20)),((100 100,200 100,200 50,100 100)))
Спасибо, буду пробовать. Мануал курил, но на примерах всегда проще понять.

Если у меня linestring не в WKT, а в WKB, то я просто не использую ST_GeomFromText, а даю ST_Collect сразу список геометрий?

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: [Рецепт] Расчет охватов регионов РФ

Сообщение Denis Rykov » 15 окт 2009, 18:39

Тогда вместо ST_GeomFromText нужно использовать ST_GeomFromWKB.
Spatial is now, more than ever, just another column- The Geometry Column.

Ezhick
Интересующийся
Сообщения: 38
Зарегистрирован: 15 окт 2009, 09:49
Репутация: 4

Re: [Рецепт] Расчет охватов регионов РФ

Сообщение Ezhick » 15 окт 2009, 20:50

А, вот оно. Вот этот момент я и упустил. Теперь понятно, почему у меня ничего не получалось. *ушел пробовать*

Ответить

Вернуться в «PostGIS/PostgreSQL»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость