由于部分地图高德地图卫星影像不够清晰,因此有需要使用天地图来作为底图的需求,接下来讲下如何实现。
首先申请高德地图和天地图apikey,此步骤自行百度。
首先AndroidManifest.xml中添加高德地图apikey(xxxx替换为你申请的key):
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.bryant.tilemap">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.AppCompat.Light.NoActionBar"
tools:ignore="GoogleAppIndexingWarning"
android:networkSecurityConfig="@xml/network_security_config"
>
<activity android:name="com.bryant.tilemap.SecondActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="xxxx" />
</application>
</manifest>
activity_main.xml中添加Mapview:
<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>
接下来看下Activity代码:
package com.bryant.tilemap;
import android.graphics.Point;
import android.os.Bundle;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
import com.amap.api.maps.AMap;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.CoordinateConverter;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.MarkerOptions;
import com.amap.api.maps.model.TileOverlayOptions;
import com.amap.api.maps.model.UrlTileProvider;
import com.bryant.tilemap.R;
import java.net.MalformedURLException;
import java.net.URL;
import butterknife.BindView;
public class SecondActivity extends AppCompatActivity {
@BindView(R.id.mapView)
MapView mapView;
private AMap aMap;
// 天地图 URL 模板
final String url = "http://t4.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION" +
"=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX=%s&" +
"TILEROW=%s&TILECOL=%s&tk=xxx";
final String url2 = "http://t4.tianditu.gov.cn/cia_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION" +
"=1.0.0&LAYER=cia&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX=%s&" +
"TILEROW=%s&TILECOL=%s&tk=xxx";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// cc();
mapView = findViewById(R.id.mapView);
mapView.onCreate(savedInstanceState);
aMap = mapView.getMap();
aMap.getUiSettings().setZoomControlsEnabled(false);// 缩放按钮是否显示
aMap.getUiSettings().setRotateGesturesEnabled(false);// 倾斜手势是否可用
aMap.moveCamera(CameraUpdateFactory.zoomTo(9));//缩放级别
aMap.getUiSettings().setLogoBottomMargin(50);//设置LOGO底部的距离
aMap.getUiSettings().setLogoLeftMargin(50);//设置LOGO左边的距离
// aMap.setMapType(AMap.MAP_TYPE_SATELLITE);
// 显示地名
aMap.showMapText(true);
// 添加自定义瓦片到地图
onlineLoad();
}
void onlineLoad(){
UrlTileProvider mUrlTileProvider = new UrlTileProvider(256, 256) {
@Override
public URL getTileUrl(int x, int y, int zoom) {
try {
String real_url = String.format(url, zoom, y, x);
LatLng mLatLng = aMap.getProjection().fromScreenLocation(new Point(x,y));
Log.e("getTileUrl",x+","+y+""+" "+mLatLng+" "+real_url);
// aMap.addMarker(new MarkerOptions().position(mLatLng).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)));
// aMap.addMarker(new MarkerOptions().icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE))).setPositionByPixels(x,y);
return new URL(real_url);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
};
TileOverlayOptions tileOverlayOptions =
new TileOverlayOptions().tileProvider(mUrlTileProvider);
UrlTileProvider mUrlTileProvider2 = new UrlTileProvider(256, 256) {
@Override
public URL getTileUrl(int x, int y, int zoom) {
try {
String real_url = String.format(url2, zoom, y, x);
LatLng mLatLng = aMap.getProjection().fromScreenLocation(new Point(x,y));
Log.e("getTileUrl2",x+","+y+""+" "+mLatLng+" "+real_url);
return new URL(real_url);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
};
TileOverlayOptions tileOverlayOptions2 =
new TileOverlayOptions().tileProvider(mUrlTileProvider2);
aMap.addTileOverlay(tileOverlayOptions).setZIndex(1);
aMap.addTileOverlay(tileOverlayOptions2).setZIndex(2);
}
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mapView.onSaveInstanceState(outState);
}
}
注意:上面代码中的tk=xxx请换成天地图申请的key。
OK,这样就能使用高德地图加载天地图了。
这里加载了2个图层,一个是卫星影像图层,一个是卫星注记图层,如果不加卫星注记图层,地名无法正常显示。图层地址参考:天地图API
web端使用天地图的案例参考:web端实现高德地图加载天地图作为底图(使用WMTS)-CSDN博客