4 votos

¿Qué es esto PostGIS consulta haciendo para mostrar un gran círculo de conexiones?

Estoy tratando de dibujar un vuelo mapa en CartoDB. Mi punto de partida es una sola lat long point. Vamos a pretender que es este:

ST_GeomFromText('POINT(-71.060316 48.432044)', 4326)

Y quiero dibujar líneas entre ese punto y los puntos en mi CartoDB tabla. Tuve un tiempo difícil incluso conseguir comenzado, pero alguien me señaló a este mapa:

http://bl.ocks.org/andrewxhill/raw/8406976/

Lo que es más elegante que lo que yo necesito (no tengo necesidad de volver a dibujar cada vez que haga clic en algún lugar), sino que incluye la consulta básica:

SELECT ST_Transform(ST_Segmentize(ST_MakeLine(
   ST_Transform(the_geom, 953027),
   ST_Transform(
          (SELECT ST_PointOnSurface(the_geom) 
          FROM lower_48_zips 
          WHERE cartodb_id = "+data.cartodb_id+"), 953027)), 100000), 4326) 
   the_geom FROM us_ski_areas WHERE mindist < 1000

Alguien también me señaló hacia un ejemplo que utiliza una consulta similar:

UPDATE experimental.airroutes
SET the_geom =
(SELECT ST_Transform(ST_Segmentize(ST_MakeLine(
       ST_Transform(a.the_geom, 953027),
       ST_Transform(b.the_geom, 953027)
     ), 100000 ), 4326 )
 FROM experimental.airports a, experimental.airports b
 WHERE a.id = airroutes.source_id 
   AND b.id = airroutes.dest_id
);

Pero estoy teniendo problemas para tirar de cualquiera de estos aparte. Estoy decentemente versado en MySQL pero totalmente nuevo a PostGIS y me encantaría ayudar a tomar distancia de lo que está sucediendo aquí y sustitución de source_id con un punto específico.

Pensé que podría hacer algo como

UPDATE my_table
SET the_geom =
(SELECT ST_Transform(ST_Segmentize(ST_MakeLine(
       ST_Transform(my_table.the_geom, 953027),
       ST_Transform(ST_GeomFromText('POINT(-71.060316 48.432044)', 4326), 953027)
     ), 100000 ), 4326 )
 FROM my_table
);

Pero sé que tengo una cláusula "where" y ni siquiera estoy seguro de lo que debe ser.

4voto

Torkel Puntos 1934

Respuesta corta en primer lugar, está super cerca. Pruebe este lugar,

UPDATE my_table
SET the_geom =
   ST_Transform(
     ST_Segmentize(
       ST_MakeLine(
         ST_Transform(my_table.the_geom, 953027),
         ST_Transform(CDB_LatLng(48.432044, -71.060316), 953027)
       ), 
       100000
     ), 
    4326 
   )

Esta sería la actualización de la tabla de puntos, para ser una línea desde el punto inicial hasta el punto en el -71, 48. He utilizado el CDB_LatLng función auxiliar. Usted no necesita As_Text función, debido a que simplemente se geometrías en texto legible por humanos.

Ahora el tiempo es que cada una de estas funciones tiene una página de documentación, usted puede encontrar estas aquí,

ST_Transform: http://postgis.net/docs/ST_Transform.html

ST_Segmentize: http://postgis.net/docs/ST_Segmentize.html

ST_MakeLine: http://postgis.net/docs/ST_MakeLine.html

Básicamente están volviendo a proyectar el mapa de referencia para hacerlo de modo que la línea más recta entre los puntos se sigue más de cerca una curva mundo (en realidad, en este caso creo que es cónica, pero el menor detalle). A continuación, segmentize por lo que se tienen puntos de referencia a todo lo largo de esa línea que siga el camino más corto a través de la curva de mapa. Entonces, su reproyectar volver a WGS84. Si usted agarró los puntos de inicio y final de la curva mundo, cuando reproyectar la espalda es simplemente ser una línea recta. Por segmentizing obtener la línea más corta más puntos de control a lo largo de esa línea que el uso de la curva de mapa. Cuando se reproyecta de vuelta a WGS84 a continuación, le siguen utilizando los mismos puntos de forma que ahora vienen curvas.

Espero que tenga algún sentido.

2voto

NilObject Puntos 7874

Los ejemplos que se dan, y de la respuesta anterior, todo dependerá de tomar la línea en un plano de proyección y, a continuación, segmentizing. Como de PostGIS 2.1 (que creo que CartoDB es) se puede hacer un uso general de trabajo de la misma mediante ST_Segmentize(geografía), así que como este:

SELECT 
  ST_Segmentize(
  ST_MakeLine(
    ST_SetSRID(ST_MakePoint(-71.060316, 48.432044),4326), 
    pt
  )::geography
  , 10000
  )::geometry
FROM mytable;

En palabras,

  • hacer un punto central en el SRS 4326
  • hacer una línea entre ese punto y en cada punto en la tabla
  • convertir esa línea en la geografía de tipo
  • segmentize en la geografía del espacio (a lo largo de la gran ruta circular)
  • convertir ese detallada de la geografía de nuevo en la geometría

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