Postgres / cursores postgis

8

Tengo una red de carreteras con StreetName y rangos de direcciones min / max para cada segmento (es decir, StreetName = 'Main St', Min = 100, Max = 199). También tengo puntos de dirección individuales con información similar (es decir, StreetName = 'Main St', HouseNumber = 115).

Me gustaría asignar el featureid (gid) de los segmentos de carretera a cada punto de dirección que tenga StreetName coincidente y se encuentre dentro del rango mínimo / máximo del segmento de carretera. En ArcGIS, probablemente escribiría un cursor de búsqueda para las carreteras y se vería un ciclo a través de cada segmento de carretera, obtendría los valores gid, name, min y max, y luego haría una declaración de consulta para encontrar todos los puntos de dirección con HouseNumbers que se encuentran dentro del rango de segmento dado (es decir, seleccione AddressPoints donde StreetName = 'Main St' y min> = 100 y max <= 199), calcule el gid del segmento de carretera en un campo para los puntos seleccionados en la capa Punto de dirección, luego continúe al siguiente tramo de carretera y repita.

  1. ¿Cómo escribiría un cursor similar en postgres / postgis o
  2. ¿Hay una manera más eficiente de hacer esto?
RyanKDalton
fuente

Respuestas:

8

Según tengo entendido su pregunta no hay necesidad de cursores. Esta es una tarea muy común y simple de hacer con SQL simple. Si llamamos a sus dos tablas segmentos de ruta y puntos de dirección con campos como este:

roadsegments
gid
the_geom
min_address
max_address

puntos de
dirección
nombre de la calle número de casa

Luego, primero puede crear la columna para el roadid en la tabla de puntos de dirección como esta:

ALTER TABLE adresspoints ADD COLUMN roadid integer;

Entonces puedes actualizar ese campo así:

UPDATE adresspoints SET roadid = roadsegmants.gid FROM 
roadsegments WHERE roadsegments.streetname=adresspoints.streetnames
AND addresspoints.housenumber >= roadsegments.min_address
AND addresspoints.housenumber <= roadsegments.max_address;

Si se trata de tablas enormes, podría ser más eficiente recrear una tabla de puntos de dirección como esta:

CREATE TABLE new_addresspoints as
SELECT a.*, b.gid as roadid  
FROM addresspoints a inner join roadsegments b
on a.streetname=b.streetnames
AND a.housenumber >= b.min_address
AND a.housenumber <= b.max_addres;

Para que las cosas funcionen rápido, también debe poner índices en streetname en ambas tablas y min_address, max_address y housenumber.

HTH
Nicklas

Nicklas Avén
fuente