Pracuję nad zadaniem, które wymaga ode mnie zdobywania punktów próbnych co 1000 km wzdłuż wybrzeży i napotkałem problem z Antarktydą. Z tego, co mogę powiedzieć, wydaje się, że jest to problem z wykorzystaniem geometrii w funkcjach, kiedy naprawdę uważam, że do tej operacji należy użyć geografii .
Korzystanie z funkcji z tym bardzo podobne pytanie , jestem w stanie produkować wynik, który wygląda tak: .
Jak widać ST_AddMeasure()
i ST_LocateAlong()
wydaje się , że nie traktuje geometrii sferycznie, co powoduje, że wiele punktów znajduje się na biegunie południowym. Punkt został nawet dodany do klipu wzdłuż linii daty (po lewej stronie). W dokumentacji tych dwóch funkcji można zastosować tylko geometrię .
Kod użyty do wygenerowania wielokąta i punktów można znaleźć tutaj , ale jest to SQL użyty do wygenerowania punktów:
CREATE TABLE atest AS WITH line AS
(SELECT
id,
ST_ExteriorRing((ST_Dump(geom)).geom) AS geom
FROM line_sample_test),
linemeasure AS
(SELECT
ST_AddMeasure(line.geom, 0, (ST_Length(line.geom))::int) AS linem,
generate_series(0, (ST_Length(line.geom))::int, 10) AS i
FROM line),
geometries AS (
SELECT
i,
ST_LocateAlong(linem, i) AS geom
FROM linemeasure)
SELECT
* from geometries;
Jak mogę generować punkty na każde 1000 km wzdłuż tej linii brzegowej?
źródło
Odpowiedzi:
Jak zasugerowano w jednym z komentarzy, najpierw przekształciłbym geometrię wejściową w polarną projekcję stereograficzną.
Dodatkowo będziesz chciał użyć
ST_Buffer
go (z pewną ilością0
), aby pozbyć się powstałej linii cięcia.Dzięki temu uzyskasz pożądany rezultat:
Zauważ, że to zapytanie zakłada, że w
line_sample_test
tabeli jest tylko jeden wiersz , więc dostosuj w razie potrzeby rzeczywiste dane wejściowe.źródło
ST_Buffer(geom, 0)
sztuczki, aby wyeliminować linię podziału - to przydatne!