Jak uzyskać odległość i namiar między punktem a najbliższą częścią wielokąta?


9

Jestem całkiem nowy w pisaniu SQL i używaniu PostGIS, więc przepraszam, jeśli wydaje się to nieco proste lub oczywiste. Mam tabelę cech wielokąta przechowywanych w bazie danych postGIS i muszę napisać zapytanie SQL, aby wybrać wszystkie atrybuty, odległość i kierunek cech wielokąta w pewnej odległości od określonego punktu. Udało mi się wybrać funkcje i obliczyć odległość (za pomocą ST_Distance), ale nie mogę ustalić, jak uzyskać łożysko.

Oto skrypt, którego używam do tej pory:

SELECT *,
  ST_Distance (Geometry, ST_GeomFromText ('POINT(292596 90785)', 27700))
FROM mytable
WHERE
  ST_DWithin(
    Geometry,
    ST_GeomFromText('POINT(292596 90785)', 27700),
    250) 

Jak obliczyć namiar funkcji i odległość?

Odpowiedzi:


4

Możesz użyć ST_Azimuth do obliczenia łożyska, ale wymaga to tylko geometrii punktowych jako parametrów, więc musisz zdecydować, które łożysko naprawdę chcesz.

Możesz wybrać najkrótszą linię, jak sugeruje @Nicklas (jest to ta z już obliczoną odległością), co ma sens, jeśli potrzebujesz najszybszego „kierunku”, aby dotrzeć do wielokąta. Jeśli chodzi o cokolwiek innego, sugeruję, abyś obliczył go względem centroidu wielokąta (ST_Centroid), co powinno dać lepsze wyniki dla dowolnych kształtów.


2

Posługiwać się

ST_Azimuth (ST_Shortestline (geom1, geom2))

edytować

Właśnie zdałem sobie sprawę, że ST_Azimuth nie bierze linii jako argumetn, więc zamiast tego będziesz musiał dać mu dwa punkty.

Jeśli jedna z geometrii jest punktem, możesz użyć tego bezpośrednio i użyć ST_ClosestPoint, aby uzyskać punkt na wielokącie.


1

ST_Azimuth to pożądana funkcja. Zwraca kąt w radianach zgodnie z ruchem wskazówek zegara od północy. Jak ST_Azimuth()pokazuje przykład na stronie, po prostu zawinięcie go w degrees()funkcję da ci kąt w stopniach, jeśli tego potrzebujesz.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.