2013-06-24 3 views
2

Я рисую круг на карте (в текущем местоположении пользователя), и я хочу, чтобы экран увеличивался, чтобы круг был в полноэкранном режиме с некоторым отрывом. Что я делаю сейчас:Google map api V2 размер экрана, чтобы соответствовать кругу, нарисованному

drawCercleAroundPin(_googleMap, DataManager.RADIUS_SEARCH_CERCLE, _location); 

moveCamera(_googleMap, (10/((DataManager.RADIUS_SEARCH_CERCLE/900) + 1))+10, 2000, _location, null); 

Ну я пробовал некоторые идиотские исчисление, так как я не был в состоянии найти правильное решение ...

Кто-нибудь есть идеи?

ответ

6

Если я правильно понял, вы хотите, чтобы ваша карта соответствовала границам круга? Если это так

добавить круг как this

mMap.addCircle(new CircleOptions() 
     .center(new LatLng(location.getLatitude(), location.getLongitude())) 
     .radius(100) 
     .strokeColor(Color.RED) 
     .fillColor(Color.BLUE)); 

**, то вам нужно ограничивающий параллелепипед вашего круга, прочитать this **

LatLngBounds bounds = boundsWithCenterAndLatLngDistance(new LatLng(location.getLatitude(), location.getLongitude()),200,200); 

** и попробовать **

private static final double ASSUMED_INIT_LATLNG_DIFF = 1.0; 
private static final float ACCURACY = 0.01f; 

public static LatLngBounds boundsWithCenterAndLatLngDistance(LatLng center, float latDistanceInMeters, float lngDistanceInMeters) { 
    latDistanceInMeters /= 2; 
    lngDistanceInMeters /= 2; 
    LatLngBounds.Builder builder = LatLngBounds.builder(); 
    float[] distance = new float[1]; 
    { 
     boolean foundMax = false; 
     double foundMinLngDiff = 0; 
     double assumedLngDiff = ASSUMED_INIT_LATLNG_DIFF; 
     do { 
      Location.distanceBetween(center.latitude, center.longitude, center.latitude, center.longitude + assumedLngDiff, distance); 
      float distanceDiff = distance[0] - lngDistanceInMeters; 
      if (distanceDiff < 0) { 
       if (!foundMax) { 
        foundMinLngDiff = assumedLngDiff; 
        assumedLngDiff *= 2; 
       } else { 
        double tmp = assumedLngDiff; 
        assumedLngDiff += (assumedLngDiff - foundMinLngDiff)/2; 
        foundMinLngDiff = tmp; 
       } 
      } else { 
       assumedLngDiff -= (assumedLngDiff - foundMinLngDiff)/2; 
       foundMax = true; 
      } 
     } while (Math.abs(distance[0] - lngDistanceInMeters) > lngDistanceInMeters * ACCURACY); 
     LatLng east = new LatLng(center.latitude, center.longitude + assumedLngDiff); 
     builder.include(east); 
     LatLng west = new LatLng(center.latitude, center.longitude - assumedLngDiff); 
     builder.include(west); 
    } 
    { 
     boolean foundMax = false; 
     double foundMinLatDiff = 0; 
     double assumedLatDiffNorth = ASSUMED_INIT_LATLNG_DIFF; 
     do { 
      Location.distanceBetween(center.latitude, center.longitude, center.latitude + assumedLatDiffNorth, center.longitude, distance); 
      float distanceDiff = distance[0] - latDistanceInMeters; 
      if (distanceDiff < 0) { 
       if (!foundMax) { 
        foundMinLatDiff = assumedLatDiffNorth; 
        assumedLatDiffNorth *= 2; 
       } else { 
        double tmp = assumedLatDiffNorth; 
        assumedLatDiffNorth += (assumedLatDiffNorth - foundMinLatDiff)/2; 
        foundMinLatDiff = tmp; 
       } 
      } else { 
       assumedLatDiffNorth -= (assumedLatDiffNorth - foundMinLatDiff)/2; 
       foundMax = true; 
      } 
     } while (Math.abs(distance[0] - latDistanceInMeters) > latDistanceInMeters * ACCURACY); 
     LatLng north = new LatLng(center.latitude + assumedLatDiffNorth, center.longitude); 
     builder.include(north); 
    } 
    { 
     boolean foundMax = false; 
     double foundMinLatDiff = 0; 
     double assumedLatDiffSouth = ASSUMED_INIT_LATLNG_DIFF; 
     do { 
      Location.distanceBetween(center.latitude, center.longitude, center.latitude - assumedLatDiffSouth, center.longitude, distance); 
      float distanceDiff = distance[0] - latDistanceInMeters; 
      if (distanceDiff < 0) { 
       if (!foundMax) { 
        foundMinLatDiff = assumedLatDiffSouth; 
        assumedLatDiffSouth *= 2; 
       } else { 
        double tmp = assumedLatDiffSouth; 
        assumedLatDiffSouth += (assumedLatDiffSouth - foundMinLatDiff)/2; 
        foundMinLatDiff = tmp; 
       } 
      } else { 
       assumedLatDiffSouth -= (assumedLatDiffSouth - foundMinLatDiff)/2; 
       foundMax = true; 
      } 
     } while (Math.abs(distance[0] - latDistanceInMeters) > latDistanceInMeters * ACCURACY); 
     LatLng south = new LatLng(center.latitude - assumedLatDiffSouth, center.longitude); 
     builder.include(south); 
    } 
    return builder.build(); 
} 

, наконец, позвонить

CameraUpdateFactory#newLatLngBounds(bounds, padding); 
+4

Мне плохо скопировать код из других ответов, и гораздо лучше связать исходное сообщение. Я планирую реорганизовать этот код, поскольку он является субоптимальным и ему также нужно будет его реорганизовать. Во всяком случае, я также исправил использование кода, когда вы отправляли радиус (100 метров) вместо диаметра (200 метров). Первоначальный вопрос состоял в том, чтобы показать область, определяемую центром, шириной и высотой. Ширина и высота круга равны 2 * радиусу. Для всех, кого это интересует, это оригинальный ответ: http://stackoverflow.com/questions/6224671/mkcoordinateregionmakewithdistance-equvivalent-in-android/16417396#16417396 –

+0

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

+0

ok Я нашел еще один ответ, который лучше всего подходит мне. Но я отметил ваш ответ, так как вы предоставили некоторое решение http://stackoverflow.com/questions/15220404/adjusting-google-map-api-v2-zoom-level-in-android –