Tengo una tabla con una columna the_geom
que contiene datos similares a:
0103000020E61000000100000005000000CE473AACFA071E40F27FB23340744740336FE841C6231E40873BED903F744740FC150A0ACE231E40D19E2684637647409C9B443D00081E409A9AF82664764740CE473AACFA071E40F27FB23340744740
Que al aplicar la función ST_AsEWKT(the_geom)
devuelve:
SRID=4326;POLYGON((7.5077921782085 46.9082092877942,7.53493597966353 46.9081898840296,7.53496566473541 46.9249119938446,7.50781341296434 46.9249314035307,7.5077921782085 46.9082092877942))
Necesito seleccionar todos los datos que están dentro de un radio de 30 km de un punto lat / long específico, por ejemplo:
- lat = 46.8167
- lng = 6.9333
Sin embargo, cada vez que intenté usar ST_Distance()
, siempre recibí valores inferiores a 1, y el uso ST_DWithin()
siempre devolvió verdadero.
Parece que está almacenando su geometría en una columna de geometría, no en una columna de geografía.
Eso está bien, pero la función ST_Distance devolverá mediciones en unidades de proyección en lugar de siempre medidores. En su caso (4326), eso serán grados.
Simplemente usar un búfer con ST_Within tampoco funcionará, ya que el ST_Buffer también se medirá con grados.
Puede convertir sus datos para usar la geografía en lugar de la geometría, o puede convertir su punto en alguna proyección que use medidores, búfer, y luego convertir de nuevo a 4326 para ver qué hay dentro:
Eso proyecta el punto en 3857 , que es una proyección popular entre los mapas web. Luego lo amortigua en 30,000 metros y luego lo vuelve a proyectar a 4326 antes de pasarlo a ST_Within.
fuente
En mi mundo, usando un SRID personalizado (para Google Maps) algo como esto funcionó:
donde el tipo de
location
es una geometría (Point, 3785), ylongitude
,latitude
yradius
son flotadores (por ejemplo, -100, 44, 30 para 100W / 44N / 30 "unidades" - ver más abajo)Vea ¿Cuál es la mejor manera de encontrar todos los objetos dentro de un radio de otro objeto? en los documentos postgis:
ACTUALIZACIÓN: las unidades no son millas para SRID 3785 ... parecen ser radianes o grados o algo así. Pero la especificación para mi SRID dice que sus unidades son metros o grados y definitivamente no es ninguno de esos, al menos no sin alguna conversión:
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
fuente
Creo que esto debería funcionar:
fuente