Итак, давайте предположим, что вы получаете местоположения (в формате JSON) из веб-службы REST.Для этого я использовал библиотеку Volley для подключения и получения ответа от сервера.
Пример ответа JSONArray:
[{..., "location": "44.924654,8.586219 ", ...}, {...," location ":" 44.906177,8.157752 ", ...}, {...," location ":" 44.906177,8.157752 ", ...}, {..., "location": "44.956733,7.876227", ...}, {..., "location": "45.034424,7.671607", ...}]
Шаг будетчтобы установить первое и последнее местоположения в качестве маркеров, а промежуточные местоположения проведут линию между ними.
Поскольку местоположение получается как строка, мы должны сначала разбить строку и назначить часть перед"," к широте, а остальные как к долготе.
public void onResponse(JSONArray response) {
if (response.length() > 0) {
try {
//creating the markers: for this I need the first and the last location
JSONObject firstLocationJson = response.getJSONObject(0);
JSONObject lastLocationJson = response.getJSONObject(response.length() - 1);
String[] firstLocationLatLng = firstLocationJson.getString("location").split(",");
Location firstLocation = new Location(LocationManager.GPS_PROVIDER);
firstLocation.setLatitude(Double.parseDouble(firstLocationLatLng[0]));
firstLocation.setLongitude(Double.parseDouble(firstLocationLatLng[1]));
String[] lastLocationLatLng = lastLocationJson.getString("location").split(",");
Location lastLocation = new Location(LocationManager.GPS_PROVIDER);
lastLocation.setLatitude(Double.parseDouble(lastLocationLatLng[0]));
lastLocation.setLongitude(Double.parseDouble(lastLocationLatLng[1]));
final float distance = firstLocation.distanceTo(lastLocation); //distance in meters
if (distance > 50000 && distance < 200000) { //distance bigger than 50 km
showMapView(response, firstLocation, lastLocation, 7);
} else if (distance > 300000) {
showMapView(response, firstLocation, lastLocation, 5);
}
} catch (JSONException e) {
// TODO
}
}
// TODO -
}
Теперь давайте посмотрим на метод, который рисует наш MapView.Обратите внимание, что я не нахожусь внутри действия, и если я хочу заставить код выполняться в главном потоке (для обновления пользовательского интерфейса), я буду использовать Handler и Runnable.Метод showMapView () предназначен для рисования маркеров и местоположений между ними.
private void showMapView(JSONArray response, Location firstLoc, Location lastLoc, final int zoom) {
final LatLng latLng1 = new LatLng(firstLoc.getLatitude(), firstLoc.getLongitude());
final LatLng latLng2 = new LatLng(lastLoc.getLatitude(), lastLoc.getLongitude());
final MarkerOptions marker1 = new MarkerOptions().position(latLng1);
final MarkerOptions marker2 = new MarkerOptions().position(latLng2);
final PolylineOptions polylineOptions = new PolylineOptions();
final ArrayList<LatLng> points = new ArrayList<LatLng>();
//saving all the locations in an ArrayList
if (response.length() > 0) {
for (int i = 0; i < response.length(); i++) {
JSONObject locationsJson = null;
try {
locationsJson = response.getJSONObject(i);
} catch (JSONException e) {
e.printStackTrace();
}
String locationString = null;
try {
locationString = locationsJson.getString("location");
} catch (JSONException e) {
e.printStackTrace();
}
//here I am splitting the location string in a String array.
String[] locationLatLng = locationString.split(",");
Location loc = new Location(LocationManager.GPS_PROVIDER);
loc.setLatitude(Double.parseDouble(locationLatLng[0]));
loc.setLongitude(Double.parseDouble(locationLatLng[1]));
LatLng latLng = new LatLng(loc.getLatitude(), loc.getLongitude());
points.add(latLng);
}
}
Handler mainHandler = new Handler(Looper.getMainLooper());
Runnable myRunnable = new Runnable() {
@Override
public void run() {
mapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
googleMap.addMarker(marker1);
googleMap.addMarker(marker2);
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng1, zoom));
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng2, zoom));
polylineOptions.addAll(points);
polylineOptions.width(10);
polylineOptions.color(Color.BLUE);
googleMap.addPolyline(polylineOptions);
}
});
}
};
mainHandler.post(myRunnable);
}
Код прост и понятен, точки (промежуточные местоположения) рисуются с использованием объекта типа PolylineOptionsи он добавляется на карту с помощью этой строки: googleMap.addPolyline(polylineOptions);
Требуемый уровень масштабирования находится в диапазоне от 2,0 до 21,0.Значения ниже этого диапазона установлены на 2,0, а значения выше этого установлены на 21,0.Увеличьте значение для увеличения. Не во всех областях есть плитки с наибольшим уровнем масштабирования. читайте здесь о зуме