3 Stimmen

Punkte innerhalb eines Begrenzungsrahmens ermitteln

Ich versuche, Orte aus meiner Postgis-Datenbank auszuwählen, die innerhalb eines bestimmten Begrenzungsrahmens liegen. Ich versuche, dies mit dieser Abfrage zu erreichen:

//latlong - latitude, longitude of a place

SELECT * FROM places WHERE St_Contains(St_GeomFromText('Polygon((:top_left_long :top_left_lat, :bottom_right_long :bottom_right_lat))'), latlong);

Zunächst einmal erhalte ich die folgende Fehlermeldung:

 Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: :top_left_lat 

Was bedeutet das? Und die zweite Frage - gebe ich diese Parameter in der richtigen Reihenfolge ein? Ich meine - erst Längengrad, dann Breitengrad?

6voto

j_freyre Punkte 4585

Hier ist eine Abfrage, die ich in einem alten Projekt verwendet habe:

SELECT param1, param2, ... 
FROM messages 
WHERE ST_Contains( 
    ST_SetSRID(
        ST_MakeBox2D(
            ST_Point(0, 50), ST_Point(50,0)
        ), 
        4326
    ), 
    the_geom
)

the_geom war meine Geometriespalte Hinweis: MakeBox2D nimmt oben-links und rechts-unten

1voto

rmcc Punkte 725

Mit diesen Argumenten kann man keine Polygon .

A Polygon ist eine ebene Fläche, die durch 1 äußere Begrenzung und 0 oder mehr innere Begrenzungen definiert ist. Jede innere Begrenzung definiert ein Loch im Polygon. Ein Dreieck ist ein Polygon mit 3 verschiedenen, nicht kollinearen Scheitelpunkten und keiner inneren Begrenzung.

Die äußere Begrenzung LinearRing definiert die "Oberseite" der Oberfläche, d. h. die Seite der Oberfläche, von der aus die äußere Begrenzung die Begrenzung entgegen dem Uhrzeigersinn zu durchlaufen scheint. Die inneren LinearRings haben die entgegengesetzte Ausrichtung und erscheinen im Uhrzeigersinn, wenn sie von "oben" betrachtet werden.

Die Behauptungen für Polygone (die Regeln, die gültige Polygone definieren) lauten wie folgt:

a) Polygone sind topologisch geschlossen;

b) Die Begrenzung eines Polygons besteht aus einer Reihe von LinearRings, die seine äußeren und inneren Grenzen bilden;

c) Keine zwei Ringe in der Begrenzung kreuzen sich und die Ringe in der Begrenzung eines Polygons können sich in einem Punkt schneiden, aber nur als Tangente, z. B.

(entnommen aus OpenGIS Implementation Specification for Geographic information - Simple feature access - Teil 1: Gemeinsame Architektur )

Mit diesen Argumenten können Sie entweder eine box2d oder erstellen Sie ein Polygon, das alle einzelnen Punkte enthält.

Zwei kurze Anmerkungen:

  1. stellen Sie sicher, dass Ihre Argumente Zeichenketten sind oder St_GeomFromText wird nicht funktionieren
  2. verwenden. ST_SetSRID Ihr Koordinatensystem zu definieren, damit Sie keine unangenehmen Ergebnisse erhalten

0voto

j_freyre Punkte 4585

Ich denke, das liegt daran, dass :top_left_long und andere Parameter werden nicht durch Ihre Werte ersetzt.

Können Sie die SQL-Abfrage vor der Ausführung drucken?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X