自定义地图示例:天地图(二)

jerry 地图开发 2015年11月26日 收藏

有了天地图地图图片的URL生成规则,就可以开始实行对自定义地图类型天地图的支持。

引路蜂地图包中类MapType,接口ICustomMapType主要用来支持自定义地图。在类MapType中定义了 GENERIC_MAPTYPE_1 ,GENERIC_MAPTYPE_2 ? GENERIC_MAPTYPE_7 用于支持自定义地图,其中类型 GENERIC_MAPTYPE_7 由两层组成(GENERIC_MAPTYPE_6和GENERIC_MAPTYPE_7),也就是说在绘制地图类型GENERIC_MAPTYPE_7时,现绘制GENERIC_MAPTYPE_6,在其上再绘制GENERIC_MAPTYPE_7,两层叠加而成。多于两层的地图图片很少见。

跟据天地图的特点,采用GENERIC_MAPTYPE_7作为其地图类型,1-10由两层地图组成,一层图像,一层标注。11层以上也可以看作两层,另一层为空层。

接口ICustomMapType只定义了一个方法:地图图片产生规则定义。

  1.  public String getTileURL(int mtype, int x, int y, int zoomLevel);
  2.  

由于目前在写Android示例,就使用Android为例,其它平台类似,在项目GISEngineTutorial中添加CustomMap Activity。

  1. package com.pstreets.gisengine.demo;
  2. import com.mapdigit.gis.raster.ICustomMapType;
  3. import com.mapdigit.gis.raster.MapType;
  4.  
  5. import com.mapdigit.gis.geometry.GeoLatLng;
  6. import com.pstreets.gisengine.R;
  7. import com.pstreets.gisengine.SharedMapInstance;
  8.  
  9. import android.app.Activity;
  10. import android.os.Bundle;
  11. import android.view.Menu;
  12. import android.view.MenuInflater;
  13. import android.view.MenuItem;
  14.  
  15. public class CustomMap extends Activity {
  16.  
  17. @Override
  18. public void onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. setContentView(R.layout.main);
  21. }
  22.  
  23. @Override
  24. public void onStart() {
  25. super.onStart();
  26. MapType.setCustomMapTileUrl(new TiandiMapType());
  27. GeoLatLng center = new GeoLatLng(32.0616667, 118.7777778);
  28. SharedMapInstance.map.setCenter(center, 13, MapType.GENERIC_MAPTYPE_7);
  29.  
  30. }
  31.  
  32. @Override
  33. public boolean onCreateOptionsMenu(Menu menu) {
  34. MenuInflater inflater = getMenuInflater();
  35. inflater.inflate(R.menu.mapzoom_menu, menu);
  36. return true;
  37. }
  38.  
  39. @Override
  40. public boolean onOptionsItemSelected(MenuItem item) {
  41. // Handle item selection
  42. switch (item.getItemId()) {
  43. case R.id.zoomin:
  44. SharedMapInstance.map.zoomIn();
  45.  
  46. return true;
  47. case R.id.zoomout:
  48. SharedMapInstance.map.zoomOut();
  49. return true;
  50.  
  51. default:
  52. return super.onOptionsItemSelected(item);
  53. }
  54.  
  55. }
  56.  
  57. }
  58.  
  59. class TiandiMapType implements ICustomMapType {
  60.  
  61. private static int serverIndex=1;
  62.  
  63. public String getTileURL(int mtype, int x, int y, int zoomLevel) {
  64. String returnURL="";
  65. serverIndex+=1;
  66. serverIndex%=6;
  67. int maxTiles=(int)Math.pow(2, zoomLevel);
  68. switch(mtype){
  69.  
  70. case MapType.GENERIC_MAPTYPE_6:
  71.  
  72. if(zoomLevel<11){
  73. returnURL= "http://tile" + serverIndex
  74. +".tianditu.com/DataServer?T=A0512_EMap";
  75. returnURL+="&X="+x+"&Y="+y+"&L="+zoomLevel;
  76.  
  77. }else if(zoomLevel<13){
  78. returnURL= "http://tile" + serverIndex
  79. +".tianditu.com/DataServer?T=B0627_EMap1112";
  80. returnURL+="&X="+x+"&Y="+y+"&L="+zoomLevel;
  81. }else{
  82. returnURL= "http://tile" + serverIndex
  83. +".tianditu.com/DataServer?T=siwei0608";
  84. returnURL+="&X="+x+"&Y="+y+"&L="+zoomLevel;
  85. }
  86.  
  87. break;
  88. case MapType.GENERIC_MAPTYPE_7:
  89. if(zoomLevel<11){
  90. returnURL= "http://tile" + serverIndex
  91. +".tianditu.com/DataServer?T=AB0512_Anno";
  92. returnURL+="&X="+x+"&Y="+y+"&L="+zoomLevel;
  93. }else{
  94. returnURL=MapType.EMPTY_TILE_URL;
  95. }
  96.  
  97. break;
  98.  
  99. }
  100. return returnURL;
  101. }
  102.  
  103. }

看起来还是不错,但仔细分析一下,天地图的分片方法和Google地图分片方法不尽相同,在同一缩放级别下,天地图比Google地图在高度方向要矮一半,具体来说,将两种地图都设成最小级(显示全世界地图),天地图大小为512X256,而Google地图为512X512。这造成的结果就是需要对天地图经纬度坐标进行调整。如何调整将在以后详细说明。但这不影响自定义地图示例方法,如果自定义地图分片方法和Google地图一样,则不需要调整经纬度坐标。要注意的是这里的调整经纬度坐标和坐标偏移是不同的概念。这里经纬度坐标调整是因为天地图和Google地图坐标投影方法不同,而坐标偏移指的是人为添加的偏移。