Saya memiliki tabel dengan kolom the_geom
yang berisi data yang mirip dengan:
0103000020E61000000100000005000000CE473AACFA071E40F27FB23340744740336FE841C6231E40873BED903F744740FC150A0ACE231E40D19E2684637647409C9B443D00081E409A9AF82664764740CE473AACFA071E40F27FB23340744740
Yang ketika menerapkan fungsi ST_AsEWKT(the_geom)
kembali:
SRID=4326;POLYGON((7.5077921782085 46.9082092877942,7.53493597966353 46.9081898840296,7.53496566473541 46.9249119938446,7.50781341296434 46.9249314035307,7.5077921782085 46.9082092877942))
Saya perlu memilih semua data yang berada dalam radius 30 km dari titik lat / panjang tertentu, misalnya:
- lat = 46.8167
- lng = 6.9333
Namun setiap kali saya mencoba menggunakan ST_Distance()
, saya selalu menerima nilai kurang dari 1, dan menggunakan ST_DWithin()
selalu mengembalikan nilai true.
Sepertinya Anda menyimpan geometri dalam kolom geometri, bukan kolom geografi.
Itu bagus, tetapi fungsi ST_Distance akan mengembalikan pengukuran dalam unit proyeksi bukannya selalu meter. Dalam kasus Anda (4326), itu akan menjadi derajat.
Hanya menggunakan buffer dengan ST_Within tidak akan berfungsi, karena ST_Buffer akan diukur dengan derajat juga.
Anda dapat mengonversi data Anda menggunakan geografi alih-alih geometri, atau Anda dapat mengubah titik Anda menjadi beberapa proyeksi yang menggunakan meter, buffer, lalu mengonversi kembali ke 4326 untuk melihat apa yang ada di dalamnya:
Itu memproyeksikan titik ke 3857 , yang merupakan proyeksi populer dengan peta web. Kemudian buffer 30.000 meter kemudian memproyeksikan kembali ke 4326 sebelum meneruskannya ke ST_Within.
sumber
Di dunia saya, menggunakan SRID khusus (untuk Google Maps) sesuatu seperti ini berfungsi:
di mana jenis
location
geometri (Titik, 3785), danlongitude
,,latitude
danradius
mengapung (misalnya -100, 44, 30 untuk "unit" 100W / 44N / 30 - lihat di bawah)Lihat Apa cara terbaik untuk menemukan semua objek dalam radius objek lain? dalam postgis docs:
UPDATE: unit bukan mil untuk SRID 3785 ... mereka tampaknya radian atau derajat atau sesuatu seperti itu. Tetapi spesifikasi untuk SRID saya mengatakan unitnya baik meter atau derajat dan itu jelas bukan keduanya, setidaknya tidak tanpa konversi:
alex=# select * from spatial_ref_sys where srid=3785; srid | auth_name | auth_srid | srtext | proj4text
3785 | EPSG | 3785 | PROJCS["Popular Visualisation CRS / Mercator (deprecated)",GEOGCS["Popular Visualisation CRS",DATUM["Popular_Visualisation_Datum",SPHEROID["Popular Visualisation Sphere",6378137,0,AUTHORITY["EPSG","7059"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6055"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4055"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3785"],AXIS["X",EAST],AXIS["Y",NORTH]] | +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs
sumber
Saya pikir ini harus bekerja:
sumber