Як користуватися ST_Intersection?


15

Ось короткий підсумок того, що я намагаюся зробити: у мене є 3 таблиці в Postgres, 'a' і 'b', у кожній є стовпець Polygon, а 'c' - стовпчик Point. Що я намагаюся тут зробити, це отримати перетини геометрії між 'a', 'b' і 'c' і відобразити такі геометрії на векторному шарі OpenLayers.

Я вже знаю, як відображати будь-яку геометрію з String у OpenLayers, але у мене виникають проблеми з функцією ST_Intersection PostGIS, я роблю це:

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 полігонів для відображення його на 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.

Я додав неправильне значення для перевірки оцінювання лише дійсних багатокутників, але це говорить про помилку в ST_Intersection (a, b), і a, b і c мають однаковий SRID, тому я справді плутаюся, вибачте, якщо я запитаю занадто багато, але я зовсім новачок із PostGIS, тому сподіваюся, що я вас не турбую багато. Спасибі.


1
Що SELECT PostGIS_Full_Version();повертає?
Майк Т

POSTGIS = "1.4.0" GEOS = "3.1.0-CAPI-1.5.0" PROJ = "Відн. 4.7.1, 23 вересня 2009" USE_STATS
Uriel

Відповіді:


8

Моя здогадка, що вона провалюється, якщо перехрестя поверне NULL. Тому слід додати перевірку пункту де, якщо насправді є перехрестя, перш ніж спробувати створити WKT.


Я спробував це: ВИБІРТЕ ST_Intersection (a.geom, b.geom) як intersect_ab ІЗ ВНУТРІШНОГО ПРИЄДНАННЯ b НА ST_Intersection (a, b) WHERE ST_Overlaps (a.geom, b.geom) AND ST_isvalid (a.geom) = 't 'AND ST_isvalid (b.geom) =' t '; але воно повернуло ту саму помилку: ** ПОМИЛКА: Функція st_intersection (a, b) не існує. Підказка: жодна функція не відповідає заданому типу імені та аргументу. Можливо, вам доведеться додати явні типи типів. ** Я справді застряг у цьому, якщо ви можете мені допомогти, я дійсно оціню це.
Уріель

Спробуйте підсумок (a.geom) та підсумок (b.geom), щоб дослідити значення.
underdark

резюме -------------------------- Полігон [BS] з 1 кільцем кільця 0 має 4 бали Багатокутник [BS] з 1 кільцем кільце 0 має 5 очок Полігон [BS] з 1 кільцем кільця 0 має 10 очок
Уріель

Так, це має бути ST_Intersection (a.geom, b.geom), а не ST_Intersection (a, b)
underdark

6

Розгадка є

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.

Як випливає з повідомлення про помилку, ви не можете використовувати st_intersection таким чином. Узагальнюючи інші відповіді, слід використовувати щось подібне:

SELECT ST_Intersection(a.geom, b.geom) as intersect_ab 
FROM a INNER JOIN b ON ST_Intersects(a.geom,b.geom)
WHERE ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

AFAIK немає сенсу використовувати st_overlaps та st_intersects в одному реченні, оскільки вони досить схожі .


4

Я перевіряю між різними шарами багатокутників, і це не вдалося, якщо в одному з шару є принаймні невірна геометрія. Чи перевіряли ви дійсність своїх багатокутників за допомогою ST_isvalid (the_geom)? Це може бути ключовим.


Я спробував це: ВИБІРТЕ ST_Intersection (a.geom, b.geom) як intersect_ab ІЗ ВНУТРІШНОГО ПРИЄДНАННЯ b НА ST_Intersection (a, b) WHERE ST_Overlaps (a.geom, b.geom) AND ST_isvalid (a.geom) = 't 'AND ST_isvalid (b.geom) =' t '; але воно повернуло ту саму помилку: ** ПОМИЛКА: Функція st_intersection (a, b) не існує. Підказка: жодна функція не відповідає заданому типу імені та аргументу. Можливо, вам доведеться додати явні типи типів. ** Я дуже розгублений, чому це не працює
Уріель

2

Спробуйте щось подібне:

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)
    ;

Джерело


Я також спробував це, але він повертає те саме повідомлення про помилку: Підказка: жодна функція не відповідає заданому типу імені та аргументу. Можливо, вам доведеться додати явні типи типів.
Уріель

Як щодо того, якщо ви використовуєте "INNER JOIN b ON ST_Intersection (a.geom, b.geom)"?
CaptDragon

Він повідомляє: ПОМИЛКА: аргумент JOIN / ON повинен бути тип булевим, а не геометричним типом.
Уріель

shizer ... повинно бути щось не так з даними або тому, що цей тип запиту працює для мене.
CaptDragon

Я додав AND ST_isvalid (a.geom) = 't' AND ST_isvalid (b.geom) = 't'; врешті-решт лише оцінити дійсні геометрії, але це говорить мені про помилку в тому, що st_intersection (a, b)
Uriel

1

Я намагався виключити недійсні геометрії, але це не спрацювало, тому врешті-решт мені довелося видалити кожну недійсну геометрію, а потім скористатися цим:

SELECT ST_AsText(ST_Intersection(a.geom, b.geom)) as intersect_ab FROM a,b 
WHERE ST_Overlaps(a.geom, b.geom) AND ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

Як ви бачите, я пропустив частину ST_Intersection (a, b), і це спрацювало чудово, я наче сумна, тому що я не могла знайти спосіб виключити недійсну геометрію з мого вибору, все-таки дякую всім, хто допомагав мені тут.


0

У мене була така проблема колись.

<pre>NOTICE:  TopologyException: found non-noded intersection between xxx, xxxx and xxx, xxx  ERROR:  GEOS Intersection() threw an error!</pre>

Мені вдалося усунути цю помилку за допомогою цього методу.
- Використовуйте QGIS
- Додайте векторний шар зі своєї бази даних
- Візьміть точку з повідомлення про помилку та знайдіть її в QGIS
   "QuickWKT" (плагін) можна використовувати для її пошуку
- Тоді ви побачите проблемну лінію рядка
- Увімкніть режим редагування
- Виберіть "інструмент вузла", щоб показати зелений вузол (проблема з вузлом)
- відсунути вузол від вузла перекриття
- зберегти зміни

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.