PostgreSQL Wybór linii zawierających się w poligonie z warunkiem

0

Mam problem z wybraniem linii których końce zawierają się o poligonie. Próbowałem takim zapytaniem, jednak nie działa:

select l.id from tmp_geoinfo.linia l, tmp_geoinfo.poligon p 
where st_contains(p.geom,st_endpoint((ST_Dump(l.geom)).geom))

Dla zobracowania wybrane muszą zostać linie 1,2,3 a 4 ma zignorować czy jest na to jakiś sposób?
https://zapodaj.net/bc84180afa678.png.html

0

Zagadnienie rozumiem tak, że wybieramy te linie, dla których przynajmniej jeden z końców należy do jakiegoś wielokąta.
Może tak:

SELECT 
  L.ID 
FROM
  TMP_GEOINFO.LINIA L
WHERE
  EXISTS (
     SELECT
         1
     FROM 
          TMP_GEOINFO.POLIGON P 
     WHERE
             ST_WITHIN( ST_STARTPOINT(L.GEOM), P.GEOM) 
          OR ST_WITHIN( ST_ENDPOINT(L.GEOM), P.GEOM) 
   )
;
0

Próbowałem czegoś takiego, ale niestety zwraca puste wartości bo warstwa to linie są multiliniami

0

No to zrób ST_Intersection tej MULTILINE z POLYGONEM i zobacz czy jest niepuste.

0

troche nie rozumiem co mi to da

0

To przestałem rozumieć zagadnienie :-)

Miałem wrażenie, ze masz kształty (linie), które chcesz wybierać o ile któryś końców jest w polygonie. Napisałeś, że jednak to są multilinie, więc napisałem, że intersection pozwoli Ci sprawdzić czy multilinia przecina się z polygonem. Jeśli tak, to masz zidentyfikowaną multilinię.

Teraz chcesz powiedzieć, że chcesz tę multilinię rozbić na linie i identyfikować te składowe multilinii, których końce są w jakimś polygonie?

0

Mam zbiór linii które są odcinkami AB i one przechodzą przez różne poligony, chciałbym otrzymać warunek, który połączy tylko te linie i te poligony, gdzie końce linii zawierają się w poligonie. Jeżeli linia nie zaczyna ani nie kończy się w poligonie to nie chce tego mieć :D jak na obrazu w poscie 1

0

No to co jest nie tak z logiką?
Wybieramy linię o ile istnieje niepuste przecięcie (ST_INTERSETCTION) z jakimś polygonem.

0

st_interesction zwróci mi wspólną cześć poligonu i lini, a ja chce tylko koniec tej lini, chyba ze ja tez nie rozumiem

0

Słuszna uwaga @wojkol1, może w takim razie: ST_DumpPoints na tej linii ?

1

Doszedłem do rozwiązania używając funkcji st_relate. Żeby sprawnie sprawdzić jaki rodzaj relacji nas interesuje, trzeba stworzyć sobie kilka linii i poligonów, narysować wszystkie przypadki i select st_relate(a.geom, b.geom) zwróci macierz. Następnie zastosować relate w warunku where, albo on :

st_relate(a.geom, b.geom, '1**0*F212')

Trzeba wspomnieć, że to kilkukrotnie wydłuża czas zapytania w stosunku do np. st_intersects

1 użytkowników online, w tym zalogowanych: 0, gości: 1