Estoy trabajando en una tarea que requiere que obtenga puntos de muestra cada 1000 km a lo largo de las costas, y me he encontrado con un problema con la Antártida. Por lo que puedo decir, parece ser un problema con el uso de la geometría en las funciones, cuando realmente creo que la geografía debería usarse para esta operación.
Uso de la función de esta pregunta muy similar , soy capaz de producir un resultado que tiene este aspecto: .
Como puede ver, ST_AddMeasure()
y ST_LocateAlong()
no parece tratar la geometría de forma esférica, lo que resulta en muchos puntos que se encuentran en el Polo Sur. Incluso se agregó un punto en el clip a lo largo de la línea de fecha (lado izquierdo). Según la documentación de estas dos funciones, solo se puede utilizar la geometría .
El código utilizado para generar el polígono y los puntos se puede encontrar aquí , pero este es el SQL utilizado para generar los puntos:
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;
¿Cómo puedo generar puntos cada 1000 km a lo largo de esta costa?
fuente
Respuestas:
Como se sugiere en uno de los comentarios, primero transformaría la geometría de entrada en una proyección estereográfica polar.
Además, querrás usarlo
ST_Buffer
(con una cantidad de0
) para deshacerte de la línea de corte resultante.Entonces esto obtendría el resultado deseado:
Tenga en cuenta que esta consulta asume que solo hay una fila en la
line_sample_test
tabla, por lo tanto, ajuste según sea necesario para sus datos de entrada reales.fuente
ST_Buffer(geom, 0)
truco para eliminar la línea de corte, ¡eso es útil!