ST_Intersection

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

ST_Intersection

Сообщение Denis Rykov » 04 сен 2009, 07:08

Пытаюсь выполнить команду в PostGIS:

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

Select ST_intersection(Transform(osm_polygon.way,4326),bounds.the_geom) from osm_polygon,bounds where bounds.na2_descri='Russia';
получаю ошибку:
NOTICE: TopologyException: found non-noded intersection between -179.991 65.8636, -179.988 65.8641 and -179.749 65.8638, -179.998 65.8638 -179.99 65.8638
ERROR: GEOS Intersection() threw an error!


Может кто сталкивался с подобным?
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9129
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 748
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Re: ST_Intersection

Сообщение Максим Дубинин » 04 сен 2009, 07:36

У меня 2 варианта:

1. Уж очень близко к 180 меридиану, если то, чем ты выбираешь за него залазит - неминуема проблема, т.к. с одной стороны там 179, а с другой -179, как на это среагирует GEOS я не знаю, но кажется проблема в этом. Бедный о.Врангеля - страшный сон всех картографов.
2. Может тут и вправду топологическая ошибка в исходнике? Именно в этой точке. Надо посмотреть и поправить, возможно исправится.
пристегивайтесь, турбулентность прямо по курсу

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

Re: ST_Intersection

Сообщение Denis Rykov » 04 сен 2009, 19:52

Да, дело было в топологии, запрос вида:

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

Select ST_intersection(Transform(osm_polygon.way,4326),bounds.the_geom) from osm_polygon,bounds where ((bounds.na2_descri='Russia') and (st_isvalid(osm_polygon.way) = true));
ошибок не выдает.
Spatial is now, more than ever, just another column- The Geometry Column.

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

Re: ST_Intersection

Сообщение Denis Rykov » 05 сен 2009, 04:27

Вот еще любопытный хак, помогающий иногда решить проблему с топологическими ошибками - использование функции ST_Buffer(geom,0), например так:

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

Select ST_intersection(ST_Buffer(osm_polygon.way,0),bounds.the_geom) from osm_polygon,bounds;
Но тут надо быть осторожным - может потеряться часть информации.
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9129
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 748
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Re: ST_Intersection

Сообщение Максим Дубинин » 05 сен 2009, 04:41

Объясни, пожалуйста, как нулевой буфер помогает? Ведь 0 буферная зона полигона = полигону.
пристегивайтесь, турбулентность прямо по курсу

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

Re: ST_Intersection

Сообщение Denis Rykov » 05 сен 2009, 09:25

Точно не знаю, но вот что пишут разработчики по этому поводу:

Be careful using st_buffer() to cleanup geometries. Using 0.0 to trick
the function to not actually buffer at all is really a hack that does
not always work. I think we have planned to build a proper
geometry-cleanup function down the road, but until then, just be careful.

(Kevin Neufeld)

ST_buffer is technically only specified to work on valid polygons.
The fact that it often helps to clean up invalid ploygons is a lucky
artifact of its implementation - but it's not part of the design.
(Martin Davis)


Хак в чистом виде:)
На всякий случай добавлю ссылку на скрипт, который чистит геометрию. Сам не использовал, но вдруг когда пригодится: http://trac.osgeo.org/postgis/wiki/User ... anPolygons. Да, к вышеописаному приему он никакого отношения не имеет.
Spatial is now, more than ever, just another column- The Geometry Column.

Ответить

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

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

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