ในโลกของฉันใช้ SRID ที่กำหนดเอง (สำหรับ Google Maps) สิ่งนี้ทำงาน:
SELECT * FROM addresses WHERE ST_DWithin(location, ST_SetSRID(ST_MakePoint(longitude, latitude), 3785), radius);
ที่ประเภทของการlocation
เป็นรูปทรงเรขาคณิต (Point, 3785) และlongitude
, latitude
และradius
มีลอย (เช่น -100, 44, 30 100W / 44N / 30 "หน่วย" - ดูด้านล่าง)
ดูวิธีที่ดีที่สุดในการค้นหาวัตถุทั้งหมดภายในรัศมีของวัตถุอื่นคืออะไร ในเอกสาร postgis:
ST_DWithin(geometry, geometry, distance)
ฟังก์ชั่นเป็นวิธีที่สะดวกในการดำเนินการค้นหาระยะทางที่จัดทำดัชนี มันทำงานได้โดยการสร้างสี่เหลี่ยมการค้นหาที่มีขนาดใหญ่พอที่จะล้อมรัศมีระยะทางจากนั้นทำการค้นหาระยะทางที่แน่นอนในชุดย่อยของดัชนีที่มีการจัดทำดัชนี
การปรับปรุง: หน่วยไม่ใช่ไมล์สำหรับ SRID 3785 ... ดูเหมือนว่าจะเป็นเรเดียนหรือองศาหรืออะไรทำนองนั้น แต่สเปคสำหรับ SRID ของฉันบอกว่าหน่วยเป็นเมตรหรือองศาและแน่นอนว่ามันไม่ใช่ของอย่างน้อยก็ไม่มีการแปลงเลย:
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