2015-04-30 2 views
0

У меня есть список широты и долготы, хранящихся в базе данных. Теперь я пытаюсь разработать функцию поиска близлежащего места из моего текущего местоположения. Значит, я должен искать всю широту и долготу из своей базы данных и посмотреть, какие из мест находятся в моей области.Найти ближайшие места android java

ответ

0

Чтобы найти расстояние от одного двухмерного точки к другой, вы можете использовать формулу Haversine, (без вызова каких-либо функций API.)

// All measurements are in meters 
var rad = function(x) { 
    return x * Math.PI/180; 
}; 

var getDistance = function(coord1, coord2) { 
    // This is the Earth's radius 
    var earthRad = 6378137; 
    var dLat = rad(coord2.lat() - coord1.lat()); 
    var dLong = rad(coord2.lng() - coord1.lng()); 
    var a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
    Math.cos(rad(coord1.lat())) * Math.cos(rad(coord2.lat())) * 
    Math.sin(dLong/2) * Math.sin(dLong/2); 
    var b = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); 
    var distance = earthRad * b; 

    // Returns distance from coord1 to coord2 in meters 
    return distance; 
}; 

Ваш вопрос немного широк, так что это не может быть лучшее решение. Если вы постоянно обновляете свое текущее местоположение, вам придется реализовать алгоритм сортировки деревьев или какой-либо другой способ оптимизации производительности, а не проверять свою базу данных на расстояния при каждом обновлении.

0

Вы можете использовать объект Location. Метод DistanceBetween или distanceTo даст вам расстояние «как ворона» между двумя точками. Оттуда вы можете отфильтровать результаты и отобразить только те места, которые вы хотите.

0

вот что я использую

public void nearBy() { 
     if (map.getMyLocation() != null) {//check if my location was found 
      db = new MyDatabase(MainActivity.context); 
      Cursor medecin = db.lireMedecin();//read values from database 
      map.clear();//clearing the map 
      while (medecin.getPosition() < medecin.getCount()) { //cheking if this doctor is nearby... 
       String Lat1 = medecin.getString(5);//doctor's latitude 
       String Lon1 = medecin.getString(6);//doctor's longitude 
       LatLng me = new LatLng(map.getMyLocation().getLatitude(), map.getMyLocation().getLongitude());//my location 
       LatLng med = new LatLng(Double.parseDouble(Lat1), Double.parseDouble(Lon1));//doctor location 
       if (CalDist(me, med) < 6) {//if distance is < 6km add marker to the map 
        map.addMarker(new MarkerOptions().position(med).title(medecin.getString(1) + " " + medecin.getString(2)) 
          .snippet(medecin.getString(4)).icon(BitmapDescriptorFactory 
            .fromResource(Icone(medecin.getString(7).charAt(0))))); //showing the doctor on the map 
       } 
       medecin.moveToNext();//next doctor 
      } 
     } else 
      Toast.makeText(context, "Gps signal not valid", Toast.LENGTH_SHORT).show();//can't find my position 
    } 

высчитывает расстояние:

public static double CalDist(LatLng StartP, LatLng EndP) { 
     int Radius = 6371;//­radius of earth in Km  
     double lat1 = StartP.latitude ; 
     double lat2 = EndP.latitude ; 
     double lon1 = StartP.longitude ; 
     double lon2 = EndP.longitude ; 
     double dLat = Math.toRadians(lat2 - lat1); 
     double dLon = Math.toRadians(lon2 - lon1); 
     double a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
        Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * 
        Math.sin(dLon/2) * Math.sin(dLon/2); 
     double c = 2 * Math.asin(Math.sqrt(a)); 
     return Radius * c; 
    } 
1
Location.distanceBetween(lat1,lon1, lat2,lon2, result); 
Смежные вопросы