Android использует Google Maps, с использованием Gaode карт для загрузки слоев Google Tiles (Loading Google tile layer with Gaode maps).
Интеграция с Gaode картами, использование ключевых методов для загрузки слоев Google Tiles
Решает проблему необходимости использования прокси для доступа к Google Maps в Android
Можно использовать любые API Gaode
Карты Google имеют немного размытый вид
На картах Google меньше меток интересных мест по сравнению с Gaode картами
Загрузка слоев Google Tiles происходит медленнее, и можно заметить базовый слой
Добавьте android:networkSecurityConfig="@xml/network_security_config"
в узле <application>
файла AndroidManifest.xml
.
Иначе невозможно получить доступ к слоям Google Tiles
Вы можете получить SHA1 серийный номер, который часто используется многими платформами Ссылка на скачивание
public class MainActivity extends AppCompatActivity {
@BindView(R.id.mapView)
MapView mapView;
private AMap aMap;
private MarkerOptions markerOptions;
private String tileUrl = "http://mt2.google.cn/vt/";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
}
}
``````java
mapView.onCreate(savedInstanceState); // Этот метод обязательно переопределяется
aMap = mapView.getMap();
aMap.getUiSettings().setZoomControlsEnabled(false); // Отображение кнопок масштабирования
aMap.getUiSettings().setRotateGesturesEnabled(false); // Возможность поворота жестами
aMap.moveCamera(CameraUpdateFactory.zoomTo(16)); // Уровень масштабирования
aMap.showMapText(false); // Не отображать названия мест, так как слои Google Tiles уже содержат метки
aMap.getUiSettings().setLogoBottomMargin(50); // Установка расстояния до нижнего края логотипа
aMap.getUiSettings().setLogoLeftMargin(50); // Установка расстояния до левого края логотипа
// Установка центра пользовательских плиток
double[] центральные_координаты = getCentralLatLng(new LatLng(**, **), new LatLng(**, **));
LatLng координаты = new LatLng(центральные_координаты[0], центральные_координаты[1]);
aMap.moveCamera(CameraUpdateFactory.newLatLng(координаты));
// Создание маркера
MarkerOptions markerOptions = new MarkerOptions();
View markerView = LayoutInflater.from(this).inflate(R.layout.marker_layout, mapView, false);
markerOptions.icon(BitmapDescriptorFactory.fromBitmap((Bitmap) markerView)); // Иконка маркера
// Добавление маркера
markerOptions.position(координаты);
aMap.addMarker(markerOptions);
aMap.animateCamera(CameraUpdateFactory.newLatLng(координаты), 500, null);
```// Обработка кликов на карте
aMap.setOnMapClickListener(latLng12 -> {
// Очистка всех маркеров на карте (также очистит слои плиток)
aMap.clear();
// Восстановление слоев плиток
aMap.addTileOverlay(tileOverlayOptions);
aMap.addTileOverlay(tileOverlayOptions2);
// Добавление нового маркера
LatLng новая_координата = new LatLng(latLng12.latitude, latLng12.longitude);
markerOptions.position(новая_координата);
aMap.addMarker(markerOptions);
aMap.animateCamera(CameraUpdateFactory.changeLatLng(новая_координата), 500, null);
});// Добавление Google плиток на карту
aMap.addTileOverlay(tileOverlayOptions);
// Добавление пользовательских плиток на карту
aMap.addTileOverlay(tileOverlayOptions2);```markdown
// Google тайловая карта
TileOverlayOptions tileOverlayOptions =
new TileOverlayOptions().tileProvider(new UrlTileProvider(256, 256) {
// x - горизонтальная координата, y - вертикальная координата, zoom - масштаб
@Override
public URL getTileUrl(int x, int y, int zoom) {
try {
/* URL адрес Google тайлового слоя карты
параметр lyrs:
m - схема
t - топографическая карта
p - топографическая карта с метками
s - спутниковое изображение
y - спутниковое изображение с метками
h - слой меток (названия улиц, городов и т. д.) */
String url = tileUrl + "lyrs=y@167000000&hl=ru-RU&gl=ru&x=" + x + "&y=" + y + "&z=" + zoom +
"&s=Galil.png";
return new URL(url);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
});
### Самопроизвольные плиточные карты
```java
// Самопроизвольные плиточные карты
TileOverlayOptions tileOverlayOptions2 =
new TileOverlayOptions().tileProvider(new UrlTileProvider(256, 256) {
// x — горизонтальная координата, y — вертикальная координата, zoom — масштаб
@Override
public URL getTileUrl(int x, int y, int zoom) {
try {
// Получение центральной точки самопроизвольной плиточной карты
double[] central = getCentralLatLng(new LatLng(**, **), new LatLng(**, **));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
});
``` // Проверка, находится ли центральная точка в пределах экрана, чтобы получить id
if (getLat().contains(new LatLng(central[0], central[1]))) {
// Корректировочная формула Y-координаты
int y2 = (int) (Math.pow(2, zoom) - y - 1);
// Адрес самопроизвольной плиточной карты
String url = "https://******/"
+ "tile_id" + "/" + zoom + "/" + x + "/" + y2 + ".png";
return new URL(url);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
});### Определение центра плиточных карт
```java
public double[] getCentralLatLng(LatLng maxLatLng, LatLng minLatLng) {
double latMax = maxLatLng.latitude - minLatLng.latitude;
double lonMax = maxLatLng.longitude - minLatLng.longitude;
return new double[]{minLatLng.latitude + latMax / 2, minLatLng.longitude + lonMax / 2};
}
public LatLngBounds getScreenBounds() {
VisibleRegion visibleRegion = aMap.getProjection().getVisibleRegion();
return visibleRegion.latLngBounds;
}
## Блок кода для разметки
```xml
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/map"
tools:context=".MainActivity"
android:name="com.google.android.gms.maps.SupportMapFragment">
<com.amap.api.maps.MapView
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )