Viac

Priesečník medzi čiarou a mnohouholníkom v PostGIS?

Priesečník medzi čiarou a mnohouholníkom v PostGIS?


Mám linestringy pozostávajúce z 2 vrcholov. Chcem dostať všetky čiary, ktoré sa nepretínajú so žiadnymi mnohouholníkmi na ceste. V mojom príklade: modrá čiara Nepretína - dotkne sa iba niektorých polygónov, ale čierna čiara sa síce dotkne nejakého mnohouholníka, ale pretína aj inú. Takže na záver je výsledkom iba modrá čiara.

To, čo som urobil:

VYBERTE lines.geom FROM lines, polygons WHERE ST_Intersects (lines.geom, polygons.geom) = false AND ST_Touches (lines.geom, polygons.geom) = true;

TheST_TouchesZdá sa, že funguje - myslím, že preto, že znázornenie riadkového reťazca pozostáva z vrcholu, ktorý sa skutočne dotýka mnohouholníka.

TheST_Intersectsnefunguje - Výsledkom je, že neexistuje ani jedna priamka, ktorá by pretínala akýkoľvek polygón.

Čo som si teda začal myslieť: Možno preto, že v priestore, kde sa priamka pretína s mnohouholníkom - neexistuje nijaké „skutočné“ znázornenie reťazca riadok: Pretože čo je riadok reťazec? 2 vrcholy obidva mimo mnohouholník…

Čo sa deje? Myslel som si, že GEO-DB by sa mal zaoberať presne týmto druhom výziev a „vie“, čo je to priestorová križovatka ...


Aj keď neviem, ako na to (pretožeST_Segmentizez nejakého dôvodu pre mňa nepracoval) Radšej tento problém neprekonám iba „rozbitím“ riadkového reťazca na viac prvkov, takže s vysokou pravdepodobnosťou bude nejaký vrchol vnútri mnohouholníka.


Ako poznamenal user30184, musíte namiesto ST_Intersects () použiť ST_Crosses ().

Váš výraz navyše funguje na jednom riadku v porovnaní s iba jedným polygónom: Čierna čiara sa dotýka Polygónu 1 a nepretína Polygón 1. Podrobnejšie:

VYBERTE x Z Čiary, mnohouholníky KDE ...

znamená: Vytvorte prípad z každého páru úsečky a mnohouholníka, takže počet prípadov je n_lines x n_polygons. Urobte klauzulu WHERE pre každý prípad a ponechajte si prípady, keď je to pravda. Výsledok: modrá čiara, P1: nepravda, modrá čiara, P2: pravda, čierna čiara, P1: pravda, čierna čiara, P2: nepravda.

Možno chcete niečo také:

VYBERTE lines.geom Z liniek, polygónov KDE ST_Touches (lines.geom, polygons.geom) A NEEXISTUJÚ (VYBERTE 1 Z polygónov p2 KDE ST_Crosses (lines.geom, p2.geom));

Odpoveď je to, čo @Redoute napísal, ale zmenil saST_IntersectsdoST_Crosses. Pretože modrá čiara pretína aj polygón 2, keď sa ho dotkne ...


Pozri si video: Свойство точки пересечения медиан треугольника