2015-02-02 4 views
0

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

    double distance = 0; 
        double minDistance = Double.MAX_VALUE; 

        convertedHotSpotGeomList = RetrieveHotSpotAsyncTask.convertedHotSpotGeom; 
        LatLng[] minPoints = new LatLng[2]; 

        for(int i = 0; i < convertedHotSpotGeomList.size(); i++){ 
         LatLng point1 = new LatLng(convertedHotSpotGeomList.get(i).getY(), convertedHotSpotGeomList.get(i).getX());         
         LatLng point2 = new LatLng(convertedHotSpotGeomList.get(++i).getY(), convertedHotSpotGeomList.get(++i).getX()); 

         distance = calculateDistance(point1, point2); 
         if(distance < minDistance){ 
          minDistance = distance; 
          minPoints[0] = point1; 
          minPoints[1] = point2; 
         } 
        } 

        // Finish all the comparison and draw the circles 
        if(minPoints[0]!=null && minPoints[1] !=null){ 
         CircleOptions circleOptions = new CircleOptions() 
          .center(minPoints[0]) 
          .radius(1000) 
          .fillColor(Color.argb(95, 178, 30, 37)) 
          .strokeColor(Color.TRANSPARENT); 
         CircleOptions circleOptions1= new CircleOptions() 
          .center(minPoints[1]) 
          .radius(1000) 
          .fillColor(Color.argb(95, 88, 130, 37)) 
          .strokeColor(Color.TRANSPARENT); 

         googleBasemap.addCircle(circleOptions); 
         googleBasemap.addCircle(circleOptions1); 

         midPoint(minPoints[0].latitude,minPoints[0].longitude,minPoints[1].latitude,minPoints[1].longitude); 
        } 
       } 

А потом от центральной точки двух кругов я нарисованных, я называю этот метод, чтобы получить среднюю точку:

private void midPoint(double lat1,double lon1,double lat2,double lon2){ 
    double dLon = Math.toRadians(lon2 - lon1); 

    lat1 = Math.toRadians(lat1); 
    lat2 = Math.toRadians(lat2); 
    lon1 = Math.toRadians(lon1); 

    double Bx = Math.cos(lat2) * Math.cos(dLon); 
    double By = Math.cos(lat2) * Math.sin(dLon); 
    double lat3 = Math.atan2(Math.sin(lat1) + Math.sin(lat2), Math.sqrt((Math.cos(lat1) + Bx) * (Math.cos(lat1) + Bx) + By * By)); 
    double lon3 = lon1 + Math.atan2(By, Math.cos(lat1) + Bx); 

    Log.i("LAT", String.valueOf(lat3)); 
    Log.i("LON", String.valueOf(lon3)); 
    CircleOptions circleOptions = new CircleOptions() 
    .center(new LatLng(lon3, lat3)) 
    .radius(1000) 
    .fillColor(Color.argb(95, 178, 30, 137)) 
    .strokeColor(Color.TRANSPARENT); 

    googleBasemap.addCircle(circleOptions); 
} 

В средней точке я хотел нарисовать еще один круг на карте google. Однако, когда я печатаю из лат и LNG для средней точки, я получаю это:

LAT 0.02512664 LON 1.811859 

Из того, что я знаю, координата карты Google должна быть 103. 1.. Я думаю, это потому, что формат отличается, и поэтому третий круг не выходит. Есть идеи?

Заранее спасибо.

+1

Прежде всего кратчайшее расстояние между двумя точками звучит немного странно. Насколько я знаю, есть только одно расстояние между точками. Медиана двух координат - это просто M ((lat1 + lat2)/2, (lng1 + lng2)/2) –

+0

Opps извините за плохое объяснение :) –

ответ

0
double lat3 = Math.atan2(Math.sin(lat1) +... 
double lon3 = lon1 + Math.atan2(By, Math.cos(lat1) + Bx); 

Это возвращает радианы. Перейти к градусам:

double latdeg = Math.toDegrees(lat3); 
double londeg = Math.toDegrees(lon3); 


103.81187377279383 
1.4396504253445948 
+0

Но если я изменил его, я перерисую первые два круга, которые minPoints [] вместо рисования третьего круга между двумя точками. Есть идеи? –

+0

Что должно вычислять MidPoint, т. Е. Где находится формула, которую вы закодировали там? – laune

+0

Я вызывал midPoint (0,0, i, i) для i = 0 (1) 90, а результаты (после добавления Math.toDegrees) выглядят вполне разумно. С какими значениями вы вызываете midPoint, где вы не получаете ожидаемого результата? – laune