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 ...
Antworten:
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.
ST_MakeEnvelope fragt nach seinen Parametern in dieser Reihenfolge :
xmin, ymin, xmax, ymax, srid
.Sie haben falsch übergeben
ymax, ymin, xmax, xmin, srid
.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_geom
Andernfalls können Sie ST_Contains verwendenSo 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
.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:
oder ändern Sie es in dieses:
quelle