Cursores do Postgres / postgis

8

Eu tenho uma rede de estradas com o StreetName e os intervalos mínimo / máximo de endereços para cada segmento (ou seja, StreetName = 'Main St', Min = 100, Max = 199). Eu também tenho pontos de endereço individuais com informações semelhantes (por exemplo, StreetName = 'Main St', HouseNumber = 115).

Gostaria de atribuir o featureid (gid) dos segmentos de estrada a cada ponto de endereço que tenha StreetName correspondente e esteja dentro do intervalo mínimo / máximo do segmento de estrada. No ArcGIS, eu provavelmente escreveria um cursor de pesquisa para as estradas e pareceria percorrer cada segmento de estrada, obteria os valores gid, name, min e max e, em seguida, faria uma instrução de consulta para encontrar todos os pontos de endereço com HouseNumbers que se enquadram no dado intervalo de segmento (ou seja, selecione AddressPoints em que StreetName = 'Main St' e min> = 100 e max <= 199), calcule o gid do segmento da estrada em um campo para os pontos selecionados na camada Address Point e, em seguida, continue para o próximo segmento de estrada e repita.

  1. Como eu escreveria um cursor semelhante no postgres / postgis ou
  2. Existe uma maneira mais eficiente de fazer isso?
RyanKDalton
fonte

Respostas:

8

Pelo que entendi sua pergunta, não há necessidade de cursores. Essa é uma tarefa muito comum e simples de fazer com o sql simples. Se chamarmos suas duas tabelas de segmentos e endereços com campos como este:

roadsegments
gid
the_geom
min_address
max_address

adresspoints
streetname
housenumber

Então você pode primeiro criar a coluna para o roadid na tabela de pontos de endereço como esta:

ALTER TABLE adresspoints ADD COLUMN roadid integer;

Então você pode atualizar esse campo assim:

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;

Se houver tabelas enormes, pode ser mais eficiente recriar a tabela de pontos de endereço 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 fazer as coisas correrem rápido, você também deve colocar índices no nome da rua nas tabelas e no min_address, max_address e housenumber.

HTH
Nicklas

Nicklas Avén
fonte