osmdroid 載入天地圖線上向量和影像資料
osmdroid 載入天地圖線上向量和影像資料
Osmdroid下載地址 Osmdroid github
效果圖
程式碼展示
影像地圖
import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import com.osmdroid.sample.R; import com.osmdroid.sample.util.CustomsOsmdroidMapConfig; import org.osmdroid.tileprovider.MapTileProviderBasic; import org.osmdroid.tileprovider.tilesource.OnlineTileSourceBase; import org.osmdroid.util.GeoPoint; import org.osmdroid.util.MapTileIndex; import org.osmdroid.views.MapView; import org.osmdroid.views.overlay.TilesOverlay; /** * 天地圖 * * 在6.0以上版本去掉了MapTile這個類,所以線上載入瓦片地圖的TileURL有點改變 */ public class TiandituTitleSouceTestActivity extends AppCompatActivity implements View.OnClickListener { private MapView mapView; CustomsOsmdroidMapConfig config = new CustomsOsmdroidMapConfig(); //影像地圖 _W是墨卡託投影 _c是國家2000的座標系 OnlineTileSourceBase tianDiTuImgTileSource = new OnlineTileSourceBase("Tian Di Tu Img", 1, 18, 256, "", new String[]{"http://t1.tianditu.com/DataServer?T=img_w", "http://t2.tianditu.com/DataServer?T=img_w", "http://t3.tianditu.com/DataServer?T=img_w", "http://t4.tianditu.com/DataServer?T=img_w", "http://t5.tianditu.com/DataServer?T=img_w", "http://t6.tianditu.com/DataServer?T=img_w"}) { @Override public String getTileURLString(final long pMapTileIndex) { return getBaseUrl() + "&X=" + MapTileIndex.getX(pMapTileIndex) + "&Y=" + MapTileIndex.getY(pMapTileIndex) + "&L=" + MapTileIndex.getZoom(pMapTileIndex); } }; //影像標註 _W是墨卡託投影 _c是國家2000的座標系 OnlineTileSourceBase tianDiTuCiaTileSource = new OnlineTileSourceBase("Tian Di Tu Cia", 1, 18, 256, "", new String[]{"http://t1.tianditu.com/DataServer?T=cia_w", "http://t2.tianditu.com/DataServer?T=cia_w", "http://t3.tianditu.com/DataServer?T=cia_w", "http://t4.tianditu.com/DataServer?T=cia_w", "http://t5.tianditu.com/DataServer?T=cia_w", "http://t6.tianditu.com/DataServer?T=cia_w"}) { @Override public String getTileURLString(final long pMapTileIndex ){ return getBaseUrl() + "&X=" + MapTileIndex.getX(pMapTileIndex) + "&Y=" + MapTileIndex.getY(pMapTileIndex) + "&L=" + MapTileIndex.getZoom(pMapTileIndex); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_title_source); initView(); } private void initView() { findViewById(R.id.button).setOnClickListener(this); mapView = (MapView) findViewById(R.id.mymapview); config.InitMapOverlays(mapView,this); mapView.setDrawingCacheEnabled(true); mapView.setMultiTouchControls(true);// 觸控放大縮小 mapView.setMaxZoomLevel(18.0); mapView.setMinZoomLevel(6.0); mapView.getController().setZoom(12.0); //mMapView mapView.setTileSource(tianDiTuImgTileSource); TilesOverlay tilesOverlay = new TilesOverlay(new MapTileProviderBasic(this,tianDiTuCiaTileSource),this); mapView.getOverlayManager().add(tilesOverlay); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button: //定位當前的位置,並設定縮放級別 mapView.getController().setZoom(18.0); mapView.getController().setCenter(new GeoPoint(23.12648183, 113.365548756)); break; default: break; } } }
向量地圖
import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import com.osmdroid.sample.R; import com.osmdroid.sample.util.CustomsOsmdroidMapConfig; import org.osmdroid.tileprovider.MapTileProviderBasic; import org.osmdroid.tileprovider.tilesource.OnlineTileSourceBase; import org.osmdroid.util.GeoPoint; import org.osmdroid.util.MapTileIndex; import org.osmdroid.views.MapView; import org.osmdroid.views.overlay.TilesOverlay; /** * 天地圖 */ public class TiandituTitleSouceTestActivity2 extends AppCompatActivity implements View.OnClickListener { private MapView mapView; CustomsOsmdroidMapConfig config = new CustomsOsmdroidMapConfig(); //地圖 _W是墨卡託投影 _c是國家2000的座標系 OnlineTileSourceBase tianDiTuImgTileSource = new OnlineTileSourceBase("Tian Di Tu Img", 1, 22, 256, "", new String[]{"http://t1.tianditu.com/DataServer?T=vec_W", "http://t2.tianditu.com/DataServer?T=vec_w", "http://t3.tianditu.com/DataServer?T=vec_w", "http://t4.tianditu.com/DataServer?T=vec_w", "http://t5.tianditu.com/DataServer?T=vec_w", "http://t6.tianditu.com/DataServer?T=vec_w"}) { @Override public String getTileURLString(final long pMapTileIndex) { return getBaseUrl() + "&X=" + MapTileIndex.getX(pMapTileIndex) + "&Y=" + MapTileIndex.getY(pMapTileIndex) + "&L=" + MapTileIndex.getZoom(pMapTileIndex); } }; //標註 _W是墨卡託投影 _c是國家2000的座標系 cva_c //(首字母中國Chinese 英文English) cva cia是代表中文 eia eva是英文 OnlineTileSourceBase tianDiTuCiaTileSource = new OnlineTileSourceBase("Tian Di Tu Cia", 1, 22, 256, "", new String[]{"http://t1.tianditu.com/DataServer?T=cva_w", "http://t2.tianditu.com/DataServer?T=cva_w", "http://t3.tianditu.com/DataServer?T=cva_w", "http://t4.tianditu.com/DataServer?T=cva_w", "http://t5.tianditu.com/DataServer?T=cva_w", "http://t6.tianditu.com/DataServer?T=cva_w"}) { @Override public String getTileURLString(final long pMapTileIndex) { return getBaseUrl() + "&X=" + MapTileIndex.getX(pMapTileIndex) + "&Y=" + MapTileIndex.getY(pMapTileIndex) + "&L=" + MapTileIndex.getZoom(pMapTileIndex); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_title_source); initView(); } private void initView() { findViewById(R.id.button).setOnClickListener(this); mapView = (MapView) findViewById(R.id.mymapview); config.InitMapOverlays(mapView,this); mapView.setMaxZoomLevel(22.0); mapView.setMinZoomLevel(6.0); mapView.getController().setZoom(12.0); //mMapView mapView.setTileSource(tianDiTuImgTileSource); TilesOverlay tilesOverlay = new TilesOverlay(new MapTileProviderBasic(this,tianDiTuCiaTileSource),this); mapView.getOverlayManager().add(tilesOverlay); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button: //定位當前的位置,並設定縮放級別 mapView.getController().setZoom(18.0); mapView.getController().setCenter(new GeoPoint(23.12648183, 113.365548756)); break; default: break; } } }
記得自已載入網路以及儲存許可權
之前網上搜集的資料
我們看到的天地圖其實是由一個個瓦片拼接而成的,而這些瓦片儲存在天地圖的服務上,並且每一個瓦片都有自己的URI,
天地圖上由四種類型的瓦片,
分別是:vec(向量底圖瓦片)、cva(向量註記瓦片)、img(影像底圖瓦片)、cia(影像註記瓦片),他們對應的URI分別是:
向量底圖:http://t0.tianditu.com/DataServer?T=vec_c&x=0&y=0&l=1
向量註記:http://t0.tianditu.com/DataServer?T=cva_c&x=0&y=0&l=1
影像底圖:
影像註記:http://t0.tianditu.com/DataServer?T=cia_c&x=0&y=0&l=1
其中每個URI包含四個引數,分別是:
T=vec_c ; x = ? ; y = ? ; l = ?;
T代表底圖型別,x代表瓦片的列號(起始位0),y代表瓦片的行號(起始位0),l代表底圖的級別(起始位1,最大為20)。
天地圖共有 8 個服務地址,子域名分別從 t0 到 t7,如下列表所示。獲取的方法和上一篇中獲取百度地圖服務地址是一樣的,F12 查看了瀏覽器的通訊資訊:
http://t0.tianditu.com/DataServer?
http://t1.tianditu.com/DataServer?
http://t2.tianditu.com/DataServer?
http://t3.tianditu.com/DataServer?
http://t4.tianditu.com/DataServer?
http://t5.tianditu.com/DataServer?
http://t6.tianditu.com/DataServer?