Seleccione todos los puntos dentro de un cuadro delimitador

11

He visto esta pregunta antes, pero las respuestas que intento no funcionan.

Estoy buscando consultar todas las formas OSM que están dentro de un cuadro delimitador. Los datos OSM se importaron con mercator esférico predeterminado. Estoy consultando usando LAT / LON, por lo tanto, la transformación

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

Cuando ejecuto esto me sale el siguiente error:

ERROR: el argumento de DONDE debe ser de tipo booleano, no de geometría de tipo LÍNEA 3: DONDE ST_Transform (ST_MakeEnvelope (37.808264, 37.804339, -12 ...

theartofbeing
fuente
1
Proporcione un enlace a las preguntas antiguas que ha estado leyendo y que utilizó para crear su consulta.
user30184
Su orden de coordenadas en ST_MakeEnvelope () no parece que estén en este formato, xmin, ymin, xmax,
ymax
@ artwork21 Estoy usando un lat / long en ST_MakeEnvelope. ¿Es eso incorrecto? ¿Necesito convertir esto a un formato diferente? Pensé que eso era lo que ST_Transform estaba haciendo
theartofbeing
1
Lo siento, tuve que volver a leer los excelentes manuales, incluido el documento de esquema wiki.openstreetmap.org/wiki/Osm2pgsql/schema#planet_osm_ways . Planet_osm_ways no contiene geometrías y es bastante inútil para el usuario final. Es para el sistema. No hay posibilidad de realizar consultas de cuadro delimitador desde esa tabla. Con tablas como planet_osm_roads es posible. Todavía planet_osm_roads.geom no existe, porque como puede ver en el esquema, se llama planet_osm_roads.way.
user30184
1
No. Dije que no puedes hacer consultas de cuadro delimitador desde planet_osm_ways porque esa tabla no tiene geometrías. Consulte: id, nodos, etiquetas, pendientes: ninguno de ellos contiene geometrías. Las tablas _line, _point, _polygon y _roads están bien. Y traté de enfatizar que la columna de geometría en todas las tablas de geometría se nombra como "camino", no como "geom" o cualquier otra cosa.
user30184

Respuestas:

14

Tiene tres problemas con su declaración, aunque el mensaje de error está insinuando solo una parte de ella ... "DÓNDE debe ser de tipo booleano" significa que la información que proporcionó DONDE no está evaluando un resultado booleano.

  1. ST_MakeEnvelope le pregunta por sus parámetros en este orden: xmin, ymin, xmax, ymax, srid.

    Pasaste incorrectamente ymax, ymin, xmax, xmin, srid.

  2. DONDE debe evaluar a booleano:

    Para determinar si una geometría y la envoltura tienen algún elemento en común, el DÓNDE debe construirse así: de lo WHERE geom && envelope_geomcontrario, puede usar ST_Contains

    Para determinar si la geometría está contenida dentro de la envolvente: `WHERE ST_Contains (envoltura_geom, geom)

    No proporcionó ningún método de comparación para el WHERE.

  3. La tabla 'planet_osm_ways' no contiene ninguna columna de geometría, aunque 'planet_osm_roads' sí contiene una columna de geometría llamada 'way'.

    Puede crear una columna de geometría en la tabla 'planet_osm_ways' a partir de los correspondientes planet_osm_nodes.lat y planet_osm_nodes.lon.

Usando 'planet_osm_roads', esto muestra cómo usar un cuadro delimitador contra una tabla con una columna de geometría:

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

o cámbielo a esto:

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
fuente