Страница 1 из 1
ST_Intersection
Добавлено: 04 сен 2009, 07:08
Denis Rykov
Пытаюсь выполнить команду в 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!
Может кто сталкивался с подобным?
Re: ST_Intersection
Добавлено: 04 сен 2009, 07:36
Максим Дубинин
У меня 2 варианта:
1. Уж очень близко к 180 меридиану, если то, чем ты выбираешь за него залазит - неминуема проблема, т.к. с одной стороны там 179, а с другой -179, как на это среагирует GEOS я не знаю, но кажется проблема в этом. Бедный о.Врангеля - страшный сон всех картографов.
2. Может тут и вправду топологическая ошибка в исходнике? Именно в этой точке. Надо посмотреть и поправить, возможно исправится.
Re: ST_Intersection
Добавлено: 04 сен 2009, 19:52
Denis Rykov
Да, дело было в топологии, запрос вида:
Код: Выделить всё
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));
ошибок не выдает.
Re: ST_Intersection
Добавлено: 05 сен 2009, 04:27
Denis Rykov
Вот еще любопытный хак, помогающий иногда решить проблему с топологическими ошибками - использование функции ST_Buffer(geom,0), например так:
Код: Выделить всё
Select ST_intersection(ST_Buffer(osm_polygon.way,0),bounds.the_geom) from osm_polygon,bounds;
Но тут надо быть осторожным - может потеряться часть информации.
Re: ST_Intersection
Добавлено: 05 сен 2009, 04:41
Максим Дубинин
Объясни, пожалуйста, как нулевой буфер помогает? Ведь 0 буферная зона полигона = полигону.
Re: ST_Intersection
Добавлено: 05 сен 2009, 09:25
Denis Rykov
Точно не знаю, но вот что пишут разработчики по этому поводу:
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. Да, к вышеописаному приему он никакого отношения не имеет.