Selecione a caixa delimitadora usando o postGIS?

36

Quero criar uma consulta para selecionar todas as formas e seus nós existentes em uma caixa delimitadora usando o postGIS. A caixa delimitadora deve incluir todos os detalhes, à medida que o comando osmose "--bounding-box" for recuperado.

Existe alguma maneira de fazer isso?

uriel
fonte

Respostas:

36

Para os documentos de osmose, vejo a opção de comando :

--bounding-box top=49.5138 left=10.9351 bottom=49.3866 right=11.201

para PostGIS, você pode usar ST_MakeEnvelope (esquerda, inferior, direita, superior, srid) para criar uma caixa delimitadora e, em seguida, o &&operador da caixa delimitadora para descobrir onde as caixas delimitadoras se cruzam:

SELECT *
FROM mytable
WHERE mytable.geom && ST_MakeEnvelope(10.9351, 49.3866, 11.201, 49.5138, 4326);

O SRID 4326 é para WGS84 Lat / Long e é necessário apenas para PostGIS 1.5; pode ser omitido para versões posteriores.

Mike T
fonte
Obrigado. a função ST_MakeEnvelope precisa de mais um parâmetro, srid. Eu não sei o que colocar lá .. alguma idéia?
uriel
1
Parece que você está usando o PostGIS 1.5, que requer esse parâmetro. Eu acho que o SRID é ignorado, então qualquer valor pode produzir os mesmos resultados. Se você tiver dados latitude / longitude, geralmente usam um SRID de 4326.
Mike T
1
Atualmente, a maioria das ferramentas permite escolher o SRID para dados OSM quando você o carrega. O OSM SRID padrão é 3857 (comerciante esférico). O SRID padrão para a maioria dos dados lat / lon é SRID 4326 (Lat / Lon AKA WGS84). Se você carregar os dados com o SRID 3857, por exemplo, precisará fazer uma conversão de LAT / LON WGS84 para 3857: ST_Transform (ST_MakeEnvelope (LON1, LAT1, LON2, LAT2, 4326), 3857) Algumas ferramentas (como imposm3) Atualmente, apenas o suporte SRID 3857
Justin Swanhart
Observe que o operador && não transforma SRIDs para você. Certifique-se de que o envelope que você criou esteja no mesmo SRID da geometria de teste, ou então transforme-o você mesmo. trac.osgeo.org/postgis/ticket/2320
Nelson
1
&& operador é computacionalmente mais lento do que ST_Intersects
caiohamamura
8

Eu acho que vai ser algo assim: A caixa delimitadora no PostGIS é criada por

ST_GeomFromText('POLYGON((ulx uly, urx ury, llx llr, lrx lry, ulx uly))', <srid>)

A consulta usará ST_Intersection com uma subconsulta.

SELECT bbox_nodes.id, bbox_nodes.tag, nodes_geom 
FROM (SELECT nodes.id, nodes.tag, 
   ST_Intersection(nodes.the_geom, 
      ST_GeomFromText('POLYGON((ulx uly, urx ury, llx llr, lrx lry, ulx uly))', <srid> )).geom AS nodes_geom
   FROM nodes 
   WHERE ST_Intersects(nodes.the_geom, 
      ST_GeomFromText('POLYGON((ulx uly, urx ury, llx llr, lrx lry, ulx uly))', <srid> )) AS bbox_nodes
WHERE ST_Dimension(bbox_nodes.nodes_geom)=0;

Aprendi mais ou menos isso nas páginas de ajuda do PostGIS.
Uma segunda consulta, na tabela de caminhos, projetada de maneira semelhante à anterior (mas com ST_Dimension () = 1) deve ser o caminho.

Micha HTH

Micha
fonte
Oi, obrigado! o que o srid? que shoul eu preciso inserir em <srid>? e ".geom" (linha 4) parece inválido, deveria estar lá?
2113 uriel
Desculpe, perdi seu comentário da semana passada. O srid é o código do sistema de referência de coordenadas. ou seja, 2039 para Israel. A adição .geom extrai a parte Geometry de um "GeometryCollection Você pode estar certo de que ele não é necessário aqui..
Micha
5

existe um tópico aqui semelhante à sua pergunta aqui ...

ST_Intersection - (T) Retorna uma geometria que representa a parte compartilhada de geomA e geomB. A implementação da geografia faz uma transformação em geometria para fazer a interseção e depois volta para WGS84.

1. você também pode obter algumas informações aqui sobre funções de construção de geometria.

SELECT ST_AsText(ST_Intersection(
  ST_Buffer('POINT(0 0)', 2),
  ST_Buffer('POINT(3 0)', 2)
));

interseção

2.Outras informações aqui sobre Intersects Intersection: PostGIS - ST_Intersects, ST_Intersection ...

SELECT b.the_geom As bgeom, p.the_geom As pgeom, 
        ST_Intersection(b.the_geom, p.the_geom) As intersect_bp
    FROM buildings b INNER JOIN parcels p ON ST_Intersection(b,p)
    WHERE ST_Overlaps(b.the_geom, p.the_geom)
    LIMIT 1;

interseção

espero que ajude você ...

Aragão
fonte
0

Este é um comentário no código de @ Micha.

Os pares de coordenadas POLYGONdevem seguir uma ordem no sentido horário (ou no sentido anti-horário): superior esquerdo, superior direito, inferior direito, inferior esquerdo, superior esquerdo novamente.

Portanto, no sentido horário, a chamada de função deve ser:

ST_GeomFromText('POLYGON((ulx uly, urx ury, lrx lry, llx llr, ulx uly))', <srid>)

Ou no sentido anti-horário:

ST_GeomFromText('POLYGON((ulx uly, llx llr, lrx lry, urx ury, ulx uly))', <srid>)
Daishi
fonte