Seleziona tutti i punti all'interno di un rettangolo di selezione


11

Ho già visto questa domanda, ma le risposte che sto provando non funzionano.

Sto cercando di interrogare tutti i modi OSM che si trovano all'interno di un riquadro di delimitazione. I dati OSM sono stati importati con mercator sferico predefinito. Sto interrogando usando LAT / LON da qui la trasformazione

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

Quando eseguo questo ottengo il seguente errore:

ERRORE: argomento di WHERE deve essere di tipo booleano, non di tipo geometria LINE 3: WHERE ST_Transform (ST_MakeEnvelope (37.808264, 37.804339, -12 ...


1
Fornisci un collegamento alle vecchie domande che hai letto e utilizzate per creare la tua query.
user30184

Il tuo ordine di coordinate in ST_MakeEnvelope () non sembra essere in questo formato, xmin, ymin, xmax, ymax
artwork21

@ artwork21 Sto usando un lat / long in ST_MakeEnvelope. È sbagliato? Devo convertirlo in un formato diverso? Ho pensato che è quello che stava facendo ST_Transform
theartofbeing

1
Spiacente, ho dovuto leggere di nuovo i buoni manuali incluso il documento dello schema wiki.openstreetmap.org/wiki/Osm2pgsql/schema#planet_osm_ways . Planet_osm_ways non contiene geometrie ed è piuttosto inutile per l'utente finale. È per il sistema. Nessuna possibilità di effettuare query sulla casella di delimitazione da quella tabella. Con tabelle come planet_osm_roads è possibile. Planet_osm_roads.geom non esiste ancora, perché come vedi dallo schema, si chiama planet_osm_roads.way.
user30184

1
No. Ho detto che non è possibile eseguire query box di delimitazione da planet_osm_ways perché quella tabella non ha geometrie. Vedi: id, nodi, tag, in sospeso - nessuno di essi contiene geometrie. Le tabelle _line, _point, _polygon e _roads sono OK. E ho cercato di enfatizzare che la colonna geometrica in tutte le tabelle geometriche è denominata "way", non come "geom" o altro.
user30184

Risposte:


14

Hai tre problemi con la tua affermazione sebbene il messaggio di errore suggerisca solo in parte ... "DOVE deve essere di tipo booleano" significa che le informazioni che hai dato a DOVE non stanno valutando un risultato booleano.

  1. ST_MakeEnvelope richiede suoi parametri in questo ordine: xmin, ymin, xmax, ymax, srid.

    Hai sbagliato invio ymax, ymin, xmax, xmin, srid.

  2. DOVE valutare come booleano:

    Per determinare se una geometria e l'inviluppo hanno elementi in comune, WHERE dovrebbe essere costruito in questo modo: WHERE geom && envelope_geomaltrimenti puoi usare ST_Contains

    Per determinare se la geometria è contenuta nella busta: `WHERE ST_Contains (envelope_geom, geom)

    Non hai fornito alcun metodo di confronto per il WHERE.

  3. La tabella "planet_osm_ways" non contiene alcuna colonna geometrica, sebbene "planet_osm_roads" contenga una colonna geometrica denominata "way".

    È possibile creare una colonna geometrica nella tabella "planet_osm_ways" dai relativi planet_osm_nodes.lat e planet_osm_nodes.lon.

Usando 'planet_osm_roads', questo mostra come usare un rettangolo di selezione su una tabella con una colonna geometrica:

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 cambiarlo in questo:

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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.