Wie kann man herausfinden, ob sich eine Lat / Long-Position in einem Polygon befindet?

8

Ich arbeite an einem System, das Breiten- / Längengradinformationen von Adressen in einer PostGIS-Tabelle speichert. Um Lat / Long im Geometriedatentyp zu speichern, verwende ich die Funktion ST_GeometryFromText.

Beispielsweise ruft der folgende Funktionsaufruf den geometrischen Wert für die angegebene Long / Lat-Position ab:

 myPointGeo =  ST_GeometryFromText('POINT(40.758871 -73.985114)');

Ebenso konvertiere ich ein Polygon wie folgt in eine geometrische Darstellung:

myPolygonGeo =  ST_GeometryFromText('POLYGON ((40.7566484549725 -73.9878561496734, 40.7556894646734 -73.9853026866913, 40.7545841705587 -73.9860537052154, 40.7548036054111 -73.9881458282471, 40.7559820394514 -73.9887895584106, 40.7566484549725 -73.9878561496734 ))')

Ich möchte herausfinden, ob sich die obige Lat / Long-Position in diesem Polygon befindet oder nicht. Dafür benutze ich die ST_Within Funktion. Obwohl sich 'myPointGeo' tatsächlich im Polygon befindet, gibt ST_Within false zurück. Ich benutze ST_Within folgendermaßen:

 St_Within(myPointGeo,myPolygonGeo)

Was mache ich hier falsch? Sollte ich zu diesem Zweck eine andere Funktion verwenden?

Haider
quelle
Heute bin ich auch in der gleichen Situation gelandet; und die Beschreibung unter diesem Link hat mir geholfen und funktioniert gut postgis.refractions.net/documentation/manual-1.4/… Zufälligerweise sind die Beispiele dort und der Datentyp, den Sie verwenden, gleich. so wird einfach zu replizieren sein
sidd.k
Beachten Sie auch, dass die Dokumente die Verwendung von ST_MakePoint im Allgemeinen vorschlagen, da es schneller ist - postgis.net/docs/ST_MakePoint.html
chrismarx

Antworten:

18

Ich denke, ST_Intersects würde besser funktionieren, es gibt ein wahr oder falsch zurück, ob sich zwei Geometrien schneiden oder nicht. Sie möchten also etwas tun wie:

SELECT ST_Intersects(myPointGeo, myPolygonGeo);

oder Sie können tun:

SELECT a.id, b.id 
FROM pointTableName a, polygonTableName b 
WHERE ST_Intersects(a.myPointGeo, b.myPolygonGeo);
HeyOverThere
quelle
Vielen Dank für Ihre Antwort
Md Amiruzzaman