Benim dünyamda, özel bir SRID (Google Haritalar için) kullanmak böyle bir şey çalıştı:
SELECT * FROM addresses WHERE ST_DWithin(location, ST_SetSRID(ST_MakePoint(longitude, latitude), 3785), radius);
burada tipi location
bir geometri (Nokta, 3785) ve longitude
, latitude
ve radius
şamandıralardır (örneğin 100W / 44N / 30 "birimler için -100, 44, 30 - aşağıya bakın)
Bkz . Başka bir nesnenin yarıçapındaki tüm nesneleri bulmanın en iyi yolu nedir? postgis dokümanlarında:
Bu ST_DWithin(geometry, geometry, distance)
fonksiyon, endeksli bir mesafe araması yapmanın kullanışlı bir yoludur. Mesafe yarıçapını kapsayacak kadar büyük bir arama dikdörtgeni oluşturarak ve ardından dizine alınan sonuçların alt kümesinde tam bir mesafe araması gerçekleştirerek çalışır.
GÜNCELLEME: birimler SRID 3785 için mil değildir ... radyan ya da derece gibi görünürler. Ancak SRID'imin özellikleri, birimlerinin metre veya derece olduğunu ve kesinlikle bunların hiçbiri olmadığını, en azından bir dönüşüm olmadan olmadığını söyledi:
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