Selecione todos os pontos dentro de uma caixa delimitadora

11

Já vi essa pergunta antes, mas as respostas que estou tentando não estão funcionando.

Eu estou olhando para consultar todas as maneiras OSM que estão dentro de uma caixa delimitadora. Os dados do OSM foram importados com o mercator esférico padrão. Estou consultando usando LAT / LON, portanto, a transformação

SELECT *
FROM planet_osm_ways
WHERE ST_Transform(
  ST_MakeEnvelope(37.808264, 37.804339, -122.275244, -122.271189, 
  4326),3857
);

Quando executo isso, recebo o seguinte erro:

ERRO: o argumento WHERE deve ser do tipo booleano, não do tipo geometria LINE 3: WHERE ST_Transform (ST_MakeEnvelope (37.808264, 37.804339, -12 ...

theartofbeing
fonte
1
Dê um link para as perguntas antigas que você leu e usou para criar sua consulta.
precisa saber é o seguinte
Seu coordenar ordem em ST_MakeEnvelope () não se parecem com eles estão neste formato, xmin, ymin, xmax, ymax
artwork21
@ artwork21 Estou usando um lat / long em ST_MakeEnvelope. Isso está errado? Preciso converter isso para um formato diferente? Eu pensei que isso é o que ST_Transform estava fazendo
theartofbeing
1
Desculpe, tive que ler os bons manuais, incluindo o documento do esquema novamente, wiki.openstreetmap.org/wiki/Osm2pgsql/schema#planet_osm_ways . Planet_osm_ways não contém geometrias e é bastante inútil para o usuário final. É para o sistema. Sem chance de fazer consultas de caixa delimitadora a partir dessa tabela. Com tabelas como planet_osm_roads, é possível. Ainda planet_osm_roads.geom não existe, porque, como você vê no esquema, ele é nomeado planet_osm_roads.way.
user30184
1
Não. Eu disse que você não pode fazer consultas de caixa delimitadora em planet_osm_ways porque essa tabela não possui geometrias. Veja: id, nós, tags, pendentes - nenhum deles contém geometrias. As tabelas _line, _point, _polygon e _roads estão OK. E tentei enfatizar que a coluna de geometria em todas as tabelas de geometria é nomeada como "caminho", não como "geom" ou qualquer outra coisa.
precisa saber é o seguinte

Respostas:

14

Você tem três problemas com a sua declaração, embora a mensagem de erro esteja indicando apenas parte dela ... "WHERE deve ser do tipo booleano" significa que as informações que você forneceu ao WHERE não estão avaliando um resultado booleano.

  1. ST_MakeEnvelope pede para seus parâmetros, nesta ordem: xmin, ymin, xmax, ymax, srid.

    Você passou incorretamente ymax, ymin, xmax, xmin, srid.

  2. ONDE deve avaliar para booleano:

    Para determinar se uma geometria e o envelope têm algum elemento em comum, WHERE deve ser construído da seguinte maneira: WHERE geom && envelope_geomcaso contrário, você pode usar ST_Contains

    Para determinar se a geometria está contida no envelope: `WHERE ST_Contains (envelope_geom, geom)

    Você não forneceu nenhum método de comparação para o WHERE.

  3. A tabela 'planet_osm_ways' não contém nenhuma coluna geométrica, embora 'planet_osm_roads' contenha uma coluna geométrica denominada 'way'.

    Você pode criar uma coluna de geometria na tabela 'planet_osm_ways' a partir de planet_osm_nodes.lat e planet_osm_nodes.lon relacionados.

Usando 'planet_osm_roads', isso mostra como usar uma caixa delimitadora em uma tabela com uma coluna de geometria:

SELECT *
FROM planet_osm_roads
WHERE planet_osm_roads.way && ST_Transform(
  ST_MakeEnvelope(-122.271189, 37.804339, -122.275244, 37.808264, 
  4326),3857
);

ou altere para:

SELECT *
FROM planet_osm_roads
WHERE ST_Contains(
    ST_Transform(
        ST_MakeEnvelope(-122.271189, 37.804339, -122.275244, 37.808264, 
        4326)
        ,3857)
    ,planet_osm_roads.way);
kttii
fonte