2013-11-25 8 views
1

Моя база данных имеет различные точки интереса. Я хочу, чтобы пользователь видел их на основе их местоположения. Также есть 3 кнопки, которые показывают точку интереса в радиусах 2 км/5 км/15 км. Я не могу реализовать масштабирование функциональности для этих радиусов. Поэтому я ищу отношения между коэффициентом масштабирования (от 2 до 21) и физическим расстоянием (в км).Как уменьшить/уменьшить масштаб карты Google до радиуса x km

Я столкнулся с этим фрагментом кода по другому вопросу в SO.

private int calculateZoomLevel(int screenWidth) { 
double equatorLength = 40075004; // in meters 
double widthInPixels = screenWidth; 
double metersPerPixel = equatorLength/256; 
int zoomLevel = 1; 
while ((metersPerPixel * widthInPixels) > 2000) { 
    metersPerPixel /= 2; 
    ++zoomLevel; 
} 
Log.i("ADNAN", "zoom level = "+zoomLevel); 
return zoomLevel; 
} 

Однако это использовалось для карт google v1, и я боюсь, что с тех пор все изменилось. Я могу сделать map.moveCamera(CameraUpdateFactory.newLatLngZoom(myLocation, 15f));, чтобы увеличить масштаб до моего местоположения с коэффициентом масштабирования 15, но теперь я не знаю радиус карты.

Благодаря

ответ

2

Вы можете получить текущую ширину экрана в км, используя VisibleRegion (GoogleMap.getProjection(). GetVisibleRegion()) вашей карты и вычисления расстояния между nearLeft и nearRight координат. Это даст вам размеры нижнего края карты. Это немного зависит от того, что вы имеете в виду под «радиусом», насколько это достаточно точно.

Факторы масштабирования должны по-прежнему вести себя одинаково в GoogleMap API V2: прирост в 1 должен удвоить расстояние. (Я не проверял, но я заключаю, что из того, как количество плиток, на которые нанесена вся земля, зависит от уровня масштабирования: это 4^зум-уровня, потому что количество плиток удваивается как в размерах x, так и y, с каждым zoomlevel.)

+0

@ user28008624 То, что я имел в виду под радиусом, является конечной точкой карты из моего местоположения. Если радиус равен 5 км, то из средней точки (myLocation) вправо наибольшая точка на карте должна быть в 5 км. –

+0

. Вы можете, конечно, сделать еще несколько расчетов и узнать длину средней горизонтали, интерполируя midLeft и midRight с Видимые граничные точки. Но при общем растяжении на 15 км даже в наклоненном виде разница будет очень малой. – user2808624

1

Самый простой способ достичь вашей цели - создать LatLngBound, который содержит 4 точки на желаемом расстоянии от центра, один перемещается на запад, один на юг, один на восток и один на север.

builder = new LatLngBounds.Builder(); 
builder.include(latLng15KmToWest); 
builder.include(latLng15KmToEast); 
builder.include(latLng15KmToSouth); 
builder.include(latLng15KmToNorth); 
latLngBounds = builder.build(); 

Затем вы можете использовать этот LatLngBounds для создания CameraUpdate.

cameraUpdate = CameraUpdateFactory.newLatLngBounds(latLngBound, 0); 
map.animateCamery(cameraUpdate); 

Карта будет увеличена точно так же, как и все 4 точки.

К сожалению, нет способа создать CameraUpdate на основе LatLngBounds, который поддерживает подшипник. Это всегда приведет к карте на север. Если это o.k. в вашем случае вам не нужно рассчитывать уровень масштабирования самостоятельно. В противном случае см. Мой другой ответ.

Смежные вопросы