Как рассчитать уровень масштабирования по возвращенным маркерам? - PullRequest
4 голосов
/ 05 августа 2009

Я хотел бы знать, есть ли уже способ узнать по заданному набору маркеров, масштаб, который я должен применить к карте, или я должен сделать это сам? (Это зависит от разрешения, поэтому я ожидал найти его в MapView, потому что он знает свои границы.)

Ответы [ 4 ]

4 голосов
/ 18 августа 2009
int minLat = Integer.MAX_VALUE;
int minLong = Integer.MAX_VALUE;
int maxLat = Integer.MIN_VALUE;
int maxLong = Integer.MIN_VALUE;

for( GeoPoint l : points ) {
    minLat  = Math.min( l.getLatitudeE6(), minLat );
    minLong = Math.min( l.getLongitudeE6(), minLong);
    maxLat  = Math.max( l.getLatitudeE6(), maxLat );
    maxLong = Math.max( l.getLongitudeE6(), maxLong );
}

mapView.getController().zoomToSpan(Math.abs( minLat - maxLat ), Math.abs( minLong - maxLong ));
0 голосов
/ 18 августа 2009

Мне нравится ваш код, который намного короче ;-), может быть, я должен только избегать создания новых экземпляров в цикле for, чтобы иметь минимальные и максимальные точки ...

С наилучшими пожеланиями, Зид Хамди

0 голосов
/ 05 августа 2009

Как и предполагалось, когда я писал ответ выше: когда частное, например,. 9, это означает, что вам нужно более 4 итераций, чтобы увидеть это: так что просто опишите обе строки:

while ((qutient / 2) > 0.5) {

С наилучшими пожеланиями, Зид Хамди

0 голосов
/ 05 августа 2009

Я пытался сделать метод сам, он не работает идеально, но кажется достаточным (может быть, мне следует округлить частное до истинного значения):

private void adjustZoomToMarkers(ArrayList<GeoLocationFlag> flags) {
    GeoPoint mapCenter = mapView.getMapCenter();
    int lat = mapCenter.getLatitudeE6(), lng = mapCenter.getLongitudeE6();
    int farestLat = 0, farestLng = 0;
    for (GeoLocationFlag geoLocationFlag : flags) {
        Log.d(LOG_TAG, "lat: " + geoLocationFlag.getLat());
        int flagLatDistance = Math.abs(geoLocationFlag.getLat() - lat);
        if (farestLat < flagLatDistance)
            farestLat = flagLatDistance;

        Log.d(LOG_TAG, "lng: " + geoLocationFlag.getLng());
        int flagLngDistance = Math.abs(geoLocationFlag.getLng() - lng);
        if (farestLng < flagLngDistance)
            farestLng = flagLngDistance;
    }
    Log.d(LOG_TAG, "farest: " + farestLat + "," + farestLng);
    Log.d(LOG_TAG, "spans: " + mapView.getLatitudeSpan() + "," + mapView.getLongitudeSpan());

    // compute how many times this screen we are far on lat
    float latQuotient = (float) farestLat / ((float) mapView.getLatitudeSpan() / 2);
    // compute how many times this screen we are far on lng
    float lngQuotient = (float) farestLng / ((float) mapView.getLongitudeSpan() / 2);

    int zoom = 0;
    if (latQuotient > 1 || lngQuotient > 1) {
        // must zoom out
        float qutient = Math.max((int) latQuotient, (int) lngQuotient);
        while ((qutient / 2) > 1) {
            qutient = qutient / 2;
            zoom--;
        }
    } else {
        float qutient = Math.max((int) (1 / (float) latQuotient), (int) (1 / (float) lngQuotient));
        while ((qutient / 2) > 1) {
            qutient = qutient / 2;
            zoom++;
        }

    }
    Log.d(LOG_TAG, "Zoom found " + zoom);

    int zoomLevel = mapView.getZoomLevel();
    mapController.setZoom(zoomLevel + zoom);
}

С уважением, Зид Хамди

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...