Loading [MathJax]/jax/element/mml/optable/GeneralPunctuation.js

6 votos

¿Cómo calcular el azimut de una línea de un multilinestring en PostGIS?

Tengo dos tablas con capacidad espacial en PostgreSQL con una geometría en cada una: La primera tabla es con tipo POINT, la segunda es con MULTILINESTRING.

Necesito calcular el azimut de la parte LINESTRING de un MULTILINESTRING que está más cerca del POINT.

Entonces la pregunta es: ¿cómo extraigo el LINESTRING en cuestión y calculo el azimut?

0 votos

Comprendiendo tu pregunta correctamente, ¿quieres calcular el azimut de un linestring que forma parte de un multilinestring? ¿Como el azimut de un palito que está más cerca de ti cuando juegas mikado =)

0 votos

Exactamente. Disculpa por el malentendido.

1 votos

¿Ya probaste mi consulta? Tengo curiosidad al respecto.

4voto

PhiLho Puntos 23458

En primer lugar, echa un vistazo a las siguientes funciones de PostGIS:

ST_NumGeometries y ST_GeometryN.

Entonces, seleccionar tus objetos individuales y calcular el azimut podría ser así (lo comprobé con algunos datos de muestra en mi PC)

WITH multiobject AS
    (SELECT
        lnumber,
        your_multilinestring_column AS geom,
        generate_series(1,100) AS n 
    FROM your_multilinestring_table),
objects AS
    (SELECT
        lnumber,
        n, 
        ST_GeometryN(geom, n) AS geometries 
    FROM  multiobject 
        WHERE n <= ST_NumGeometries(geom))

    SELECT DISTINCT ON
        (ST_Distance(your_point_column, geometries))
        ST_Azimuth(ST_Startpoint(geometries), ST_Endpoint(geometries))
    FROM objects, your_point_table
        GROUP BY geometries, your_point_column
        ORDER BY ST_Distance(your_point_column, geometries)
            LIMIT 1;

Explicaremos esto un poco.

En la primera parte se selecciona tu MULTILINESTRING y se construye algo así como una secuencia con generate_series (como máximo una colección de geometrías con 100 objetos; n=100). Puedes cambiar n cuando tengas más de 100 objetos en tu columna de multilíneas.

Con ST_GeometryN(geom, n) seleccionas los objetos individuales y estableces el límite usando n <= ST_NumGeometries(geom). Así que tu resultado de la consulta es tan grande como los objetos en tu tabla de multilíneas.

En la última parte (quizás un poco complicada) seleccionas la distancia entre tus datos de puntos y los objetos (geometries) en tu columna de multilíneas. Con SELECT DISTINCT ON puedes eliminar filas duplicadas de tu conjunto de resultados. Al ordenar con ST_Distance(your_point_column, geometries) y limitar el conjunto de resultados a 1, tienes la línea más cercana "extraída" en la parte superior.

El resultado de esta consulta es el azimut de una línea que es la más cercana a todos los puntos de una tabla. Tal vez debas establecer algunas cláusulas WHERE con tus ID en tus tablas de geometría (como gids o algo similar).

EDICIÓN

Mantente simple con ST_Dump. Creo que esto es mucho más fácil.

WITH objects AS
    (SELECT
        (ST_Dump(your_multilinestring_column)).geom AS geometries
    FROM your_multilinestring_table)

    SELECT DISTINCT ON
        (ST_Distance(your_point_column, geometries))
        ST_Azimuth(ST_Startpoint(geometries), ST_Endpoint(geometries))
    FROM objects, your_point_table
        GROUP BY geometries, your_point_column
        ORDER BY ST_Distance(your_point_column, geometries)
        LIMIT 1;

De las refracciones de PostGIS:

ST_Dump — Retorna un conjunto de filas geometry_dump (geom,path), que componen una geometría

La ventaja de la primera consulta quizás sea que puedes seleccionar un objeto distinto con n. No sé cómo seleccionar objetos individuales con ST_Dump usando el path.

4voto

NilObject Puntos 7874

¿Estoy entendiendo mal? ¿No es simplemente esto?:

SELECT
   ST_Azimuth(p.geom, ST_ClosestPoint(l.geom,p.geom)) AS azimuth
FROM line l, point p

Si tiene más de un elemento en las tablas de línea y punto, la pregunta de qué condición los une se vuelve importante, pero según lo describió, es solo un elemento en cada una.

0 votos

¿No es este el azimut de una línea "imaginaria" entre el punto y el punto más cercano de la línea (multilínea)? Lo entiendo de esa manera, que él quiere saber el azimut de la línea, que está más cerca al punto. Eso es lo que hace mi consulta.

0 votos

Azimut del segmento más cercano, o azimut hacia el segmento más cercano? Lo primero se menciona, pero parece ser algo extraño querer calcular.

0 votos

Estoy buscando calcular el azimut del segmento más cercano. Disculpa por el malentendido.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X