Daugiau

Linijos ir daugiakampio sankirta „PostGIS“?

Linijos ir daugiakampio sankirta „PostGIS“?


Aš turiu linestrings susideda iš 2 viršūnių. Noriu gauti visas linijas, kurios kelyje nesikerta su jokiais daugiakampiais. Mano pavyzdyje: mėlyna linija nekerta - liečia tik kai kuriuos daugiakampius, tačiau juoda linija, nors liečiasi su kai kuriais daugiakampiais, kerta ir kitus. Taigi apibendrinant, rezultatas yra tik mėlyna linija.

Ką aš padariau:

PASIRINKTI lines.geom FROM linijas, daugiakampius WHERE ST_Interects (lines.geom, polygons.geom) = false IR ST_Touches (lines.geom, polygons.geom) = true;

TheST_Touchatrodo, kad veikia - spėju, nes linijos eilutės vaizdą sudaro viršūnė, kuri tikrai liečia daugiakampį.

TheST_Interectsneveikia - rezultatas yra tas, kad nėra net 1 tiesės, kuri kerta bet kurį daugiakampį.

Taigi, ką aš pradėjau galvoti: Gal todėl, kad erdvėje, kurioje linija kerta daugiakampį, nėra „realaus“ linijos eilutės atvaizdavimo: Nes kas yra eilutė? 2 viršūnės, esančios už daugiakampio ribų ...

Kas vyksta? Maniau, kad GEO-DB turėtų tiksliai spręsti tokio pobūdžio iššūkius ir „žino“, kas yra erdvinė sankirta ...


Nors aš nežinau, kaip tai padaryti (nesST_Segmentuotiman kažkodėl neveikė) nenorėčiau įveikti šios problemos, tiesiog „pertraukdamas“ linijos eilutę daugiau elementų, kad didelė tikimybė, kad kai kurios viršūnės būtų daugiakampio viduje.


Kaip pažymėjo user30184, vietoj ST_Intersects () turite naudoti ST_Crosses ().

Be to, jūsų išraiška veikia vienoje eilutėje, palyginti tik su vienu daugiakampiu: juoda linija liečia daugiakampį 1 ir nekerta daugiakampio 1. Išsamiau:

SELECT x FROM linija, daugiakampiai WHERE…

reiškia: Sukurkite atvejį iš kiekvienos tiesės ir daugiakampio poros, taigi atvejų skaičius yra n_lines x n_polygons. Atlikite sąlygą WHERE kiekvienam atvejui ir palikite tuos atvejus, kai tai tiesa. Rezultatas: mėlyna linija, P1: klaidinga, mėlyna linija, P2: tiesa, juoda linija, P1: tiesa, juoda linija, P2: klaidinga.

Gal norite kažko panašaus:

PASIRINKTI lines.geom NUO linijų, daugiakampių, KUR ST_Touches (lines.geom, polygons.geom) IR NĖRA (PASIRINKITE 1 FROM poligonus p2 WHERE ST_Crosses (lines.geom, p2.geom));

Atsakymas yra tai, ką parašė @Redoute, bet keiskiteST_InterectsįST_Kryžiai. Nes mėlyna linija taip pat kertasi su 2 daugiakampiu, kai jį paliečia ...


Žiūrėti video įrašą: QGIS: How to import GPS coordinate points to a map?