5 votos

¿Encontrar el punto más cercano de un PDI en PostGIS?

Tengo datos de puntos de interés en MySQL. Estos son los campos

latitud, longitud, dirección, tipos

en el que he almacenado los datos. Ahora quiero importarlos a la base de datos PostGIS. Pero, ¿se requiere la geometría de este punto?

qué comando se debe utilizar para encontrar el punto más cercano con radio o distancia ?

0 votos

¿Podemos eliminar las referencias a MySQL aquí? ¿@polygeo? ¿Nadie respondió realmente a su pregunta original? Y no tenía nada que ver con PostGIS originalmente. Para confundir aún más el asunto MySQL ahora soporta bounding box dentro y puede hacer lo mismo dev.mysql.com/doc/refman/8.0/es/

0 votos

@EvanCarroll eso no es algo que creo que debamos hacer sin probar primero el apoyo de la comunidad. Con tantos votos ya sobre la pregunta y sus respuestas creo que deberíamos usar un Meta Q&A para ver qué quiere hacer la comunidad con ella. Hazme saber si quieres que pregunte ese Meta Q&A o prefieres hacerlo tú mismo.

0 votos

No tengo intención de preguntar a la comunidad. Mejor lo cierro o quito la referencia. Sandeep parecía haberse pasado a usar PostGIS, por lo que es claramente una reliquia por los comentarios de sus respuestas, y no hay ni una sola respuesta aquí que contemple MySQL. Así que deberíamos votar a la baja todas ellas, o cambiar la pregunta para que importen (sólo por la colaboración de Sandeep en las respuestas con PostGIS como solución).

7voto

hernan43 Puntos 566

Lleve sus datos a PostgreSQL con algo como mysql_fdw o otros métodos .

Una vez que tenga esta tabla, añada un columna de geografía y rellenar la nueva columna:

ALTER TABLE places ADD COLUMN geog geography(Point,4326);
UPDATE places SET geog = ST_MakePoint(longitude, latitude);

Ahora seleccione los 10 lugares más cercanos que se encuentren en un radio de 100 kms:

SELECT places.*, ST_Distance(geog, poi)/1000 AS distance_km
FROM places,
  (select ST_MakePoint(-90,47)::geography as poi) as poi
WHERE ST_DWithin(geog, poi, 100000)
ORDER BY ST_Distance(geog, poi)
LIMIT 10;

0 votos

¿100 Kms no es más que el radio? ¿Puedo restringir el resultado con tipos?

1 votos

Claro, sólo hay que modificar el WHERE parte de la consulta. También sí, ST_DWithin es un filtro que utiliza un radio personalizado en metros.

0 votos

¿Cómo puedo modificar los campos de la tabla "latitud, longitud" a UNIQUE?

3voto

Josh Puntos 569

Puede que no sea absolutamente necesario crear geometrías, pero querrá hacerlo para poder aprovechar los índices. El siguiente código funciona con Postgres 9.1+

 CREATE TABLE mypoints(gid SERIAL PRIMARY KEY, latitude double precision, longitude double precision, address varchar(100), types varchar (25), geom geometry(POINT, 4326));

 INSERT INTO mypoints (latitude, longitude, address, types, geom)VALUES (40.0,-90.0, '123 Main', 'house', ST_GEOMFROMTEXT('POINT(-90.0 40.0)',4326))
 INSERT INTO mypoints (latitude, longitude, address, types, geom)VALUES (41.0,-90.0, '123 Smith', 'house', ST_GEOMFROMTEXT('POINT(-90.0 41.0)',4326))
 INSERT INTO mypoints (latitude, longitude, address, types, geom)VALUES (42.0,-90.0, '123 Johnson', 'house', ST_GEOMFROMTEXT('POINT(-90.0 42.0)',4326))
 INSERT INTO mypoints (latitude, longitude, address, types, geom)VALUES (43.0,-90.0, '123 Oak', 'warehouse', ST_GEOMFROMTEXT('POINT(-90.0 43.0)',4326))
 INSERT INTO mypoints (latitude, longitude, address, types, geom)VALUES (44.0,-90.0, '123 Pine', 'store', ST_GEOMFROMTEXT('POINT(-90.0 44.0)',4326))
 INSERT INTO mypoints (latitude, longitude, address, types, geom)VALUES (45.0,-90.0, '123 Granite', 'factory', ST_GEOMFROMTEXT('POINT(-90.0 45.0)',4326))

  SELECT latitude, longitude, address, types
    FROM  mypoints
ORDER BY geom <-> st_setsrid(st_makepoint(-90,47),4326)
 LIMIT 1;

Si está buscando todas las características/puntos dentro de una determinada distancia, podría utilizar St_DWithin()

1 votos

Lamentablemente, no se deben utilizar operadores de distancia simples en coordenadas no proyectadas. ¿Está 'POINT(-92.1 47.0)' más cerca o más lejos del PDI que "123 Granite"? Aunque su distancia "cartesiana" es de 2,1 (ligeramente más lejos), su distancia en el esferoide lo convierte en un punto más cercano.

0 votos

Buen punto Mike. Tendría sentido convertir a un SRS que sea verdadero para la distancia o utilizar el tipo de geografía PostGIs. El método anterior seguiría funcionando en un SRS como una de las Zonas UTM.

1 votos

@DaveF sí el operador '<->' funciona maravillosamente en una zona UTM.

0voto

Eric Wang Puntos 101

Utilice postgresql como base de datos, e instale la extensión postgis, y habilite la extensión para su base de datos.

A continuación, utilice una columna similar a location GEOGRAPHY(POINT,4326) a la ubicación de la tienda.

Crear un índice para la columna utilizando el tipo de índice GIST, similar a:

CREATE INDEX global_points_gix ON global_points USING GIST ( location );

Insertar similar como:

INSERT INTO global_points (name, location)
VALUES ('Town', ST_GeographyFromText('SRID=4326;POINT(-110 30)') );

Consulta de puntos dentro de un rango de distancia similar a:

SELECT name FROM global_points
WHERE ST_DWithin(location, ST_GeographyFromText('SRID=4326;POINT(-110 29)'), 1000000);

Más detalles en:

http://postgis.refractions.net/docs/using_postgis_dbmanagement.html#PostGIS_Geography

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