2012-08-30 15 views
9

Tengo la siguiente consulta:distancia en metros en vez de grados en SpatiaLite

select distance(GeomFromText('POINT(8 49)',4326),GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)',4326)) 

esto me da 0,97 grados. Pero lo necesito en metros y no sé a qué SRID transformarse.

¿Alguien puede darme un ejemplo de cómo obtener el resultado en metros para spatialite?

Todas las posiciones están en Europa.

Respuesta

14

Simplemente multiplique el valor en grados por 111195 - este valor es (Earth mean radius)*PI/180 - que es la 'longitud media de un grado de gran círculo en metros en la superficie de la Tierra'.

El error máximo el uso de este método es ~ 0,1%


EDITAR

bien, mi respuesta anterior sigue en pie la pregunta: "cómo convertir arcos en grados en longitudes en metros", sin embargo, no es la pregunta que hizo (debería haber preguntado).

No he utilizado Spatialite profesionalmente, así que supuse que su consulta de muestra realmente devuelve la 'longitud en grados'. Eso no es cierto.

Desafortunadamente, parece que Spatialite no puede calcular la distancia en 'sentido geográfico'. A pesar de que sus geometrías están definidas con SRID 4326, las trata como si estuvieran en un avión.

Aquí es una prueba sencilla:

select Distance(GeomFromText('POINT(0 0)',4326),GeomFromText('POINT(3 4)',4326)); 

vuelve 5.0.

Es una pena ...

permite echar un vistazo a su búsqueda original:

select Distance(
    GeomFromText('POINT(8 49)',4326), 
    GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)',4326) 
) 

Una consulta equivalente en MS SQL Server:

SELECT (geography::STGeomFromText('POINT(8 49)', 4326)).STDistance(geography::STGeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)', 4326)); 

se obtiene el resultado correcto inmediatamente: 105006.59673084648, en metros, y sin ninguna brouhaha adicional.

¿Cuáles son sus opciones con Spatialite?

De hecho, como dijo en los comentarios, una opción es proyectar sus geometrías y calcularlas. Usar SRID 3035 para Europa también tiene sentido (si sus ubicaciones están principalmente en Alemania, consideraría SRID 25832).

select Distance(
    Transform(GeomFromText('POINT(8 49)',4326),25832), 
    Transform(GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)',4326),25832) 
) 

devuelve 104969.401605453.

En cuanto a su otra muestra (en los comentarios):

select distance(
    Transform(GeomFromText('POINT(8.328957 49.920900)',4326),3035), 
    Transform(GeomFromText('POINT(8.339665 49.918000)',4326),3035) 
) 

Hay una manera más sencilla de hacerlo (si tiene dos puntos, no un punto y una serie lineal): crear una serie lineal con sus puntos y GeodesicLength utilizar la función, así:

select GeodesicLength(GeomFromText('LINESTRING(8.328957 49.920900, 8.339665 49.918000)',4326)) 

devuelve 833.910006698673, como se esperaba.

+0

Hmm, esto me pone de posiciones por encima de 1218 metros. Cuando uso Google Earth, esto me lleva a una distancia de 833 metros. Después de probar un rato utilicé esta consulta: seleccionar distancia (transformar (GeomFromText ('POINT (8.328957 49.920900)', 4326), 3035), transformar (GeomFromText ('POINT (8.339665 49.918000)', 4326), 3035)) que me da 834 metros – tmanthey

+0

sí, debería funcionar razonablemente bien (ver mi respuesta editada, también) – Incidently

+0

Muchas gracias. Última pregunta. ¿Tienes una forma elaborada de elegir un SRID? – tmanthey

8

En el functions reference guide de SpatiaLite, puede ver que hay dos versiones de la función Distance(). Uno toma solo dos argumentos y devuelve la distancia en unidades CRS, el otro toma 3 argumentos y regresa la distancia en metros.

para obtener la distancia en metros, sólo tiene que pasar un tercer argumento a Distancia:

sqlite> select Distance(MakePoint(0, 0), MakePoint(3, 4)); 
5.0 
sqlite> select Distance(MakePoint(0, 0), MakePoint(3, 4), 1); 
554058.923752633 
Cuestiones relacionadas