¿Cómo obtengo el valor del medidor de distancia entre dos geometrías en PostGIS?

14

Tengo una pregunta simple sobre el cálculo de distancias en PostGIS.

Me gustaría obtener la distancia entre dos geometrías. Estoy usando este sid: 4269 en metros, lo que estoy haciendo ahora es esto: ST_Distance((a.geom,b.geom)) FROM ...pero obtengo el resultado en grados. Creo que debería trabajar con la geografía, pero ¿cómo puedo convertir una geom a una geografía? Intenté con (a.geom :: geography) pero recibo un error.

¿Qué puedo hacer para obtener mi resultado en metros?

Gracias

YassineGeoma
fuente

Respuestas:

20

con ST_Distance_Sphere puedes lograr eso:

ST_Distance_Sphere(a.geom,b.geom)
Francisco Valdez
fuente
ERREUR: la fon st_distance_spheroid (geometry, geometry) n'existe pas ... acabo de agregar (a.geom, b.geom, 'SPHEROID ["WGS 84", 6378137,298.257223563]) y ahora funciona bien gracias Tú mucho !
YassineGeoma
1
bueno, usaste una función diferente, st_distance_spheroid que es más lenta que st_distance_sphere pero más precisa.
Francisco Valdez
¿Qué pasa con la distancia máxima entre 2 geometrías?
vasilakisfil
La distancia máxima sería tierra_radio - distancia_mínima, que sería viajar en sentido contrario. (rumbo + 180º)
Francisco Valdez
1
@ don-prog Funciona para puntos 3D y 2D:SELECT ST_Distance_Sphere(ST_GeomFromEWKT('SRID=4326;POINT(-72.1235 42.3521 4)'), ST_GeomFromEWKT('SRID=4326;POINT(-72.1260 42.45 15)'))
Francisco Valdez
3

Las unidades de SRID 4269 ( NAD 83 ) no son metros; esta es una proyección geodésica , es decir, las coordenadas son grados (coordenadas geográficas).

La respuesta de pacofvf le dará la distancia en metros, pero si realmente tenía sus coordenadas iniciales especificadas en metros, entonces debería usar un sistema de coordenadas proyectadas. Probablemente para América del Norte desee algo como el Sistema de coordenadas del plano estatal que tiene varias proyecciones diferentes según la región que desee asignar.

Sin embargo, sospecho que solo está usando valores de lat / lon, por lo que probablemente este segundo párrafo no sea relevante, solo use la ST_Distance_Spherefunción como se indicó anteriormente.

Stev_k
fuente