Bagaimana cara mengetahui apakah posisi lat / long berada di dalam Poligon?

8

Saya sedang mengerjakan sistem yang menyimpan informasi lintang / bujur dari alamat dalam tabel PostGIS. Untuk menyimpan Lat / Long dalam tipe data geometri, saya menggunakan fungsi ST_GeometryFromText.

Misalnya panggilan fungsi berikut mendapatkan nilai geometris terhadap posisi Long / Lat yang ditentukan:

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

Demikian pula, saya mengubah Polygon menjadi representasi geometris sebagai berikut:

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 ))')

Saya ingin mencari tahu apakah posisi lat / long di atas berada dalam Polygon ini atau tidak. Untuk ini saya menggunakan fungsi ST_Within. Tetapi meskipun 'myPointGeo' sebenarnya berada di dalam Polygon, ST_Within kembali palsu. Saya menggunakan ST_Within dengan cara ini:

 St_Within(myPointGeo,myPolygonGeo)

Apa yang saya lakukan salah di sini? Haruskah saya menggunakan beberapa fungsi lain untuk tujuan ini?

Haider
sumber
Hari ini saya juga mendarat di situasi yang sama; dan deskripsi yang ada di tautan ini membantu saya dan berfungsi dengan baik postgis.refractions.net/documentation/manual-1.4/…. Secara tidak sengaja contoh di sana dan tipe data yang Anda gunakan sama; jadi akan mudah untuk mereplikasi
sidd.k
Juga mencatat bahwa docs menyarankan untuk menggunakan ST_MakePoint, secara umum karena itu lebih cepat - postgis.net/docs/ST_MakePoint.html
chrismarx

Jawaban:

18

Saya pikir ST_Intersects akan bekerja lebih baik, ia mengembalikan benar atau salah pada apakah dua geometri berpotongan. Jadi, Anda ingin melakukan sesuatu seperti:

SELECT ST_Intersects(myPointGeo, myPolygonGeo);

atau kamu bisa melakukan:

SELECT a.id, b.id 
FROM pointTableName a, polygonTableName b 
WHERE ST_Intersects(a.myPointGeo, b.myPolygonGeo);
HeyOverThere
sumber
Terima kasih atas jawaban Anda
Md Amiruzzaman