Wählen Sie alle Punkte innerhalb eines Begrenzungsrahmens aus

11

Ich habe diese Frage schon einmal gesehen, aber die Antworten, die ich versuche, funktionieren nicht.

Ich möchte alle OSM-Möglichkeiten abfragen, die sich innerhalb eines Begrenzungsrahmens befinden. OSM-Daten wurden mit dem Standard-Kugel-Mercator importiert. Ich frage mit LAT / LON ab, daher die Transformation

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

Wenn ich dies ausführe, wird folgende Fehlermeldung angezeigt:

FEHLER: Argument von WHERE muss vom Typ boolean sein, nicht vom Typ Geometrie. LINE 3: WHERE ST_Transform (ST_MakeEnvelope (37.808264, 37.804339, -12 ...

das Herz des Seins
quelle
1
Geben Sie einen Link zu alten Fragen an, die Sie gelesen und zum Erstellen Ihrer Abfrage verwendet haben.
user30184
Ihre Koordinatenreihenfolge in ST_MakeEnvelope () sieht nicht so aus, als ob sie in diesem Format vorliegen: xmin, ymin, xmax, ymax
artist21 21.
@ artist21 Ich verwende ein lat / long in ST_MakeEnvelope. Ist das falsch? Muss ich dies in ein anderes Format konvertieren? Ich dachte, das ist es, was ST_Transform tat
am
1
Entschuldigung, ich musste die feinen Handbücher einschließlich des Schemadokuments noch einmal lesen . Wiki.openstreetmap.org/wiki/Osm2pgsql/schema#planet_osm_ways . Planet_osm_ways enthält keine Geometrien und ist für Endbenutzer eher nutzlos. Es ist für das System. Keine Möglichkeit, Bounding-Box-Abfragen aus dieser Tabelle durchzuführen. Mit Tabellen wie planet_osm_roads ist das möglich. Planet_osm_roads.geom existiert immer noch nicht, da es, wie Sie aus dem Schema sehen, planet_osm_roads.way heißt.
user30184
1
Nein. Ich sagte, Sie können keine Begrenzungsrahmenabfrage von planet_osm_ways durchführen, da diese Tabelle keine Geometrien enthält. Siehe: ID, Knoten, Tags, ausstehend - keine von ihnen enthält Geometrien. Die Tabellen _line, _point, _polygon und _roads sind in Ordnung. Und ich habe versucht zu betonen, dass die Geometriespalte in allen Geometrietabellen als "Weg" bezeichnet wird, nicht als "Geom" oder irgendetwas anderes.
user30184

Antworten:

14

Sie haben drei Probleme mit Ihrer Anweisung, obwohl die Fehlermeldung nur einen Teil davon anzeigt ... "WHERE muss vom Typ boolean sein" bedeutet, dass die Informationen, die Sie dem WHERE gegeben haben, kein boolesches Ergebnis ergeben.

  1. ST_MakeEnvelope fragt nach seinen Parametern in dieser Reihenfolge : xmin, ymin, xmax, ymax, srid.

    Sie haben falsch übergeben ymax, ymin, xmax, xmin, srid.

  2. WO muss boolesch auswerten:

    Um festzustellen, ob eine Geometrie und die Hüllkurve gemeinsame Elemente haben, sollte WHERE folgendermaßen aufgebaut sein: WHERE geom && envelope_geomAndernfalls können Sie ST_Contains verwenden

    So bestimmen Sie, ob die Geometrie in der Hüllkurve enthalten ist: `WHERE ST_Contains (Envelope_geom, Geom)

    Sie haben keine Vergleichsmethode für die WHERE.

  3. Die Tabelle 'planet_osm_ways' enthält keine Geometriespalte, obwohl 'planet_osm_roads' eine Geometriespalte mit dem Namen 'way' enthält.

    Sie können eine Geometriespalte in der Tabelle 'planet_osm_ways' aus den zugehörigen planet_osm_nodes.lat und planet_osm_nodes.lon erstellen.

Mit 'planet_osm_roads' wird gezeigt, wie ein Begrenzungsrahmen für eine Tabelle mit einer Geometriespalte verwendet wird:

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

oder ändern Sie es in dieses:

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
quelle