Вот краткое изложение того, что я пытаюсь сделать: у меня есть 3 таблицы в Postgres, 'a' и 'b', у каждой есть столбец Polygon, а у 'c' есть столбец Point. Здесь я пытаюсь получить пересечения геометрий между «a», «b» и «c» и отобразить такие геометрии на векторном слое OpenLayers.
Я уже знаю, как отображать любую геометрию из строки в OpenLayers, но у меня проблемы с функцией PostGIS ST_Intersection, я делаю это:
SELECT ST_Intersection(a.geom, b.geom) as inter from a, b;
где a.geom и b.geom оба являются столбцами геометрии, и я получаю это сообщение об ошибке:
NOTICE: TopologyException: found non-noded intersection between 515172 2.14408e+06, 497067 2.13373e+06 and 501321 2.13546e+06, 471202 2.14843e+06 500621 2.13576e+06
ERROR: GEOS Intersection() threw an error!
Также я попытался выразить результирующую геометрию как текст с помощью ST_AsText следующим образом:
SELECT ST_AsText(ST_Intersection(a.geom, b.geom)) as inter from a, b;
но он отправляет мне это сообщение об ошибке:
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
Я не знаю, что я делаю неправильно, я просто хочу, чтобы WKT Polygons отображал его на OpenLayers, вот как я отображаю геометрию из WKT:
var in_options = {
'internalProjection': new OpenLayers.Projection("EPSG:4326"),
'externalProjection': new OpenLayers.Projection("EPSG:4326")
};
var fea= new OpenLayers.Format.WKT(in_options).read(data); //data is the string with the WKT
vectorLayer.addFeatures([fea]); //this piece of code works great
map.zoomToExtent(bounds);
ОБНОВЛЕНИЕ: я попробовал следующее:
SELECT ST_Intersection(a.geom, b.geom) as intersect_ab FROM a INNER JOIN b ON
ST_Intersection(a,b) WHERE ST_Overlaps(a.geom, b.geom)
AND ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';
но я получаю следующее сообщение об ошибке:
ERROR: Function st_intersection(a,b) does not exist.
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
Я добавил isvalid, чтобы убедиться, что оцениваются только действительные полигоны, но он говорит, что ошибка в ST_Intersection (a, b), a, b и c имеют одинаковый SRID, так что я действительно запутался, извините, если я спрашиваю слишком много, но я новичок в PostGIS, так что я надеюсь, что я вас не побеспокою. Благодарю.
SELECT PostGIS_Full_Version();
возвращает?Ответы:
Я предполагаю, что это не удастся, если пересечение возвращает NULL. Поэтому вы должны добавить предложение where, проверяющее, действительно ли существует пересечение, прежде чем пытаться создать WKT.
источник
Ключ
Как говорится в сообщении об ошибке, вы не можете использовать st_intersection таким образом. Обобщая другие ответы, вы должны использовать что-то вроде этого:
AFAIK Нет смысла использовать st_overlaps и st_intersects в одном предложении, поскольку они очень похожи .
источник
Я проверил между разными слоями полигонов, и это не удалось, если в одном из слоев есть хотя бы неправильная геометрия. Вы проверяли правильность своих полигонов, используя ST_isvalid (the_geom)? Это может быть ключом.
источник
Попробуйте что-то вроде этого:
Источник
источник
Я пытался исключить неверные геометрии, но это не сработало, поэтому в конце концов мне пришлось удалить все неверные геометрии, а затем использовать это:
Как вы можете видеть, я пропустил часть ST_Intersection (a, b), и это сработало замечательно, я, к сожалению, из-за того, что не смог найти способ исключить любую некорректную геометрию из моего выбора, в любом случае спасибо всем за помощь прочь.
источник
У меня была эта проблема однажды.
Мне удалось устранить эту ошибку, используя этот метод.
- Использовать QGIS
- Добавить векторный слой из вашей базы данных
- Возьмите точку из сообщения об ошибке и найдите его в QGIS.
«QuickWKT» (плагин) можно использовать, чтобы найти ее.
- Затем вы увидите проблемную строку
- Включите режим редактирования.
- Выберите «инструмент узла», чтобы показать зеленый узел (проблема с узлом)
- отодвиньте узел от узла перекрытия
- сохраните изменения
источник