2010-10-21 11 views
6

lo que trato de hacer: el usuario selecciona inicio y destino en un mapa y luego desde sus coordenadas quiero mostrar la ubicación más cercana de una lista de ubicaciones en el mapa . Tengo una base de datos Sqlite simple que contiene la longitud, la latitud y el nombre de las posibles ubicaciones.busque el punto Gps más cercano a la ubicación del usuario de una lista

hice algunas investigaciones y esto es lo que encontré:

http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL

pero esto es para usarlo con MySQL y una especie de extensión de búsqueda espacial. ¿hay alguna posibilidad de que pueda hacer algo similar usando la API de Android o las librerías externas?

public Point dialogFindClosestLocationToPoint(geometry.Point aStartPoint){ 
List<PointWithDistance> helperList=new ArrayList<PointWithDistance>(); 
try { 
openDataBase(); 
Cursor c=getCursorQueryWithAllTheData(); 
if(c.moveToFirst()) 
do{ 
    PointWithDistance helper=new PointWithDistance(c.getDouble(1),c.getDouble(2),c.getString(3)); 
    int distance=returnDistanceBetween2Points(aStartPoint, helper); 
    if(distance<MAX_SEARCH_DISTANCE){ 
    helper.setDistance(distance); 
    Log.i("values", helper.name); 
    helperList.add(helper); 
    } 
}while (c.moveToNext()); 
Collections.sort(helperList,new PointComparator()); 

if(helperList!=null) 
return helperList.get(0); 
else return null; 
}catch(SQLException sqle){ 

throw sqle; 

} 
finally{ 
close(); 
} 

este es el código de la clase PointComparator():

public int compare(PointWithDistance o1, PointWithDistance o2) { 
    return (o1.getDistance()<o2.getDistance() ? -1 : (o1.getDistance()==o2.getDistance() ? 0 : 1)); 
} 

donde PointWithDistance es un objeto que contiene: latitud, longitud, distancia, nombre

sin embargo esta solución no hace proporcione la información de devolución correcta ... y me doy cuenta de que no es escalable y muy lenta. Necesito una solución que se ejecute rápidamente con una base de datos con un máximo de 1000 filas.

edición: mi había un error en el código de la clasificación ahora tengo que cambiar (debe estar < en lugar de>)

Respuesta

2

que estaba buscando algo muy similar hace algún tiempo:

Android sqlite sort on calculated column (co-ordinates distance)

que estaba usando una búsqueda de MySQL en mi servidor, MySQL le permite crear una columna virtual, realiza el cálculo y las clases por distancia y entonces se puede establecer el número máximo de resultados devueltos o la distancia max - funciona muy bien:

Select Lat, Lon, acos(sin($lat)*sin(radians(Lat)) + cos($lat)*cos(radians(Lat))cos(radians(Lon)-$lon))$R As dist From MyTable ORDER BY dist DESC 

quería realizar la misma operación en mi aplicación - tirar de todos los puntos con el fin de distanciarse de los Locati usuarios en permitirme mostrar los más cercanos.Terminé yendo con una solución similar a la sugerida en el enlace anterior pero me di cuenta de que probablemente no sea la solución óptima, pero funciona para el propósito que quería.

+0

Creo que ha estado pasando variables a través de php. $ lat es su latitud actual, $ lon es la latitud actual. Pero, ¿qué es $ R? –

+0

¿No es $ R el radio de la tierra? ver: http://www.movable-type.co.uk/scripts/latlong.html – leochab

1

No he probado el funcionamiento de su código, pero parece que funcionaría , es solo que no es eficiente. como que en realidad no necesita clasificar, necesita extraer el mínimo.

puede restringir su consulta solo al cuadrado que es de tamaño (2 * MAX_SEARCH_DISTANCE)^2 (con su punto en el medio. De esta manera está localizando su consulta y le devolverá menos resultados para calcular la distancia . (? quizá poco probable). para por supuesto, esto no ayudará si todas las ubicaciones están en la plaza localizada

Además, supongo que se podría utilizar la distancia de Hamilton en lugar de euclidiana distancia euclídea = sqrt ((Lat0. - lat1)^2 + (lon0 - lon1)^2) distancia de hamitonian = (lat0 - lat1) + (lon0 - lon1)

+0

en realidad estoy usando la función definida en la aplicación Android api para calcular la distancia entre dos coordenadas gps. como descubrí que es muy preciso y toma la forma de la tierra también en cuenta. "necesitas el extracto el mínimo". ¿Cuál es la mejor manera de hacer eso? – DArkO

3

Thi El tipo de cosas se hace de la manera más eficiente usando un R-Tree. El JSI library proporciona una implementación de Java que he utilizado con éxito con un índice de 80,000 ubicaciones, procesando miles de búsquedas por segundo. Sin embargo, es posible que no se ejecute en Android.

+0

sí, encontré información de que r-tree es una solución bastante buena para esto, pero hasta ahora no he encontrado ninguna biblioteca para Android con la que trabajar. Seguiré buscando y probando lo mencionado anteriormente. – DArkO

Cuestiones relacionadas