ArcGIS讀取天地圖2.0
天地圖2.0(http://www.chinaonmap.com)於2013年3月份上線,基本情況如下:
1) 基於OGC的WMTS 1.0.0版本;
2) 提供向量地圖、影像地圖和地形圖;
3) 提供兩種座標系:國家2000大地座標系和Web Mercator投影座標系;
4) 地圖和標註資料分開,向量地圖和影像地圖提供中英文標註,地形圖僅提供中文標註。
ArcGIS介面可以靈活擴充套件支援天地圖。本文是以ArcGIS Runtime SDK for Android為例說明如何擴充套件來載入天地圖的。其它產品,比如Web APIs、Native SDKs、Portal for ArcGIS、桌面都可以通過擴充套件實現對天地圖的支援。要獲取擴充套件原始碼及示例,包括使用說明文件,請點選此處下載
1. ArcGIS WMTS介面訪問天地圖
ArcGIS產品,包括桌面產品、Web APIs、Native SDKs都提供了對WMTS的支援。如此,可以通過這些介面來訪問天地圖的WMTS服務。但是實際情況要複雜一些,經過測試發現,使用ArcGIS的WMTS介面訪問天地圖,會出現偏差,如下圖所示。
經過研究發現,產生偏差的根本原因在於:ArcGIS WMTS介面中使用的DPI與天地圖使用的DPI不一致。
OGCWMTS標準中規定,通過getcapatilities請求可以獲得WMTS的後設資料。上圖是天地圖2.0 WMTS後設資料的部分截圖(XML格式)。後設資料中包含各個級別的比例尺資料(如圖中紅框內容)。在訪問WMTS時,需要通過這些後設資料計算出解析度,公式如下所示。
OGC WMTS規範中DPI採用90.71(即採用0.028mm作為一個畫素的物理寬度),而天地圖使用的DPI採用國家標準規定的96(見《電子地圖規範》)。由於ArcGIS WMTS介面實現均遵循OGC WMTS標準,使用90.71作為DPI來計算解析度,導致ArcGIS通過WMTS介面訪問天地圖時,圖片物理尺寸變大,使得地圖看上去向右下方偏移。
2. 擴充套件ArcGIS介面訪問天地圖(以ArcGIS Runtime SDK forAndroid為例)
在第2小結,分析了用ArcGIS WMTS介面訪問天地圖產生偏移的原因,那麼就可以有針對性的對ArcGIS介面進行擴充套件,來實現對天地圖的訪問。
ArcGIS介面可以擴充套件。以ArcGIS Runtime SDK for Android為例,提供了TiledServiceLayer類。這是訪問切片服務的基礎類,通過擴充套件這個類,就可以訪問天地圖的WMTS服務了。擴充套件之前,需要了解一下天地圖服務的一些引數,包括:(1)比例尺
// 兩種座標系下的解析度一致 private static final double[] SCALES = { 2.958293554545656E8, 1.479146777272828E8, 7.39573388636414E7, 3.69786694318207E7, 1.848933471591035E7, 9244667.357955175, 4622333.678977588, 2311166.839488794, 1155583.419744397, 577791.7098721985, 288895.85493609926, 144447.92746804963, 72223.96373402482, 36111.98186701241, 18055.990933506204, 9027.995466753102, 4513.997733376551, 2256.998866688275 }; |
(2)解析度
// 墨卡託座標系下的解析度 private static final double[] RESOLUTIONS_MERCATOR = { 78271.51696402048, 39135.75848201024, 19567.87924100512, 9783.93962050256, 4891.96981025128, 2445.98490512564, 1222.99245256282, 611.49622628141, 305.748113140705, 152.8740565703525, 76.43702828517625, 38.21851414258813, 19.109257071294063, 9.554628535647032, 4.777314267823516, 2.388657133911758, 1.194328566955879, 0.5971642834779395 };
// 國家2000座標系下的解析度 private static final double[] RESOLUTIONS_2000 = { 0.7031249999891485, 0.35156249999999994, 0.17578124999999997, 0.08789062500000014, 0.04394531250000007, 0.021972656250000007, 0.01098632812500002, 0.00549316406250001, 0.0027465820312500017, 0.0013732910156250009, 0.000686645507812499, 0.0003433227539062495, 0.00017166137695312503, 0.00008583068847656251, 0.000042915344238281406, 0.000021457672119140645, 0.000010728836059570307, 0.000005364418029785169}; |
(3)起始點
// 國家2000座標系下的起始點 private static final Point ORIGIN_2000 =new Point(-180, 90); // 墨卡託座標系下的起始點 private static final Point ORIGIN_MERCATOR =new Point(-20037508.3427892, 20037508.3427892); |
(4)地圖範圍
// 國家2000座標系下的地圖範圍 private static final double X_MIN_2000 = -180; private static final double Y_MIN_2000 = -90; private static final double X_MAX_2000 = 180; private static final double Y_MAX_2000 = 90; // 墨卡託座標系下的地圖範圍 private static final double X_MIN_MERCATOR = -20037508.3427892; private static final double Y_MIN_MERCATOR = -20037508.3427892; private static final double X_MAX_MERCATOR = 20037508.3427892; private static final double Y_MAX_MERCATOR = 20037508.3427892; |
有了以上資訊,通過擴充套件TiledServiceLayer,就可以訪問天地圖了,核心程式碼如下所示:
TianDiTuLayer.java
public class TianDiTuLayer extends TiledServiceLayer {
private TianDiTuLayerInfolayerInfo;
public TianDiTuLayer(int layerType) { super(true); this.layerInfo = LayerInfoFactory.getLayerInfo(layerType); this.init(); }
private void init() { try { getServiceExecutor().submit(new Runnable() { publicvoid run() { TianDiTuLayer.this.initLayer(); } }); } catch (RejectedExecutionException rejectedexecutionexception) { Log.e("ArcGIS","initialization of the layer failed.", rejectedexecutionexception); } }
protected byte[] getTile(int level,int col, int row)throws Exception { if (level >layerInfo.getMaxZoomLevel() || level < layerInfo.getMinZoomLevel()) return new byte[0]; String url = layerInfo.getUrl() + "?service=wmts&request=gettile&version=1.0.0&layer=" + layerInfo.getLayerName() +"&format=tiles&tilematrixset=" + layerInfo.getTileMatrixSet() +"&tilecol=" + col + "&tilerow=" + row +"&tilematrix=" + (level+1); Map<String, String> map = null; return com.esri.core.internal.io.handler.a.a(url, map); }
protected void initLayer() { if (getID() == 0L) { nativeHandle = create(); changeStatus(com.esri.android.map.event.OnStatusChangedListener.STATUS .fromInt(-1000)); } else { this.setDefaultSpatialReference(SpatialReference.create(layerInfo .getSrid())); this.setFullExtent(new Envelope(layerInfo.getxMin(),layerInfo .getyMin(), layerInfo.getxMax(),layerInfo.getyMax())); this.setTileInfo(new TileInfo(layerInfo.getOrigin(),layerInfo .getScales(), layerInfo.getResolutions(),layerInfo .getScales().length,layerInfo.getDpi(), layerInfo .getTileWidth(), layerInfo.getTileHeight())); super.initLayer(); } } } |
以下程式碼說明如何使用擴充套件後的TianDiTuLayer來顯示天地圖服務。
mapMercator = (MapView) this.findViewById(R.id.mapMercator); Layer mapLayer = new TianDiTuLayer(TianDiTuLayerTypes.TIANDITU_VECTOR_MERCATOR); this.mapMercator.addLayer(mapLayer); Layer annotationLayer = new TianDiTuLayer( TianDiTuLayerTypes.TIANDITU_VECTOR_ANNOTATION_CHINESE_MERCATOR); this.mapMercator.addLayer(annotationLayer); |
3. 總結
ArcGIS介面可以靈活擴充套件。以上是以ArcGIS Runtime SDK for Android為例說明如何擴充套件來載入天地圖。其它介面,比如Web APIs、Native SDKs、Portal for ArcGIS、桌面都可以通過類似的方式實現擴充套件。想擴充套件原始碼及示例,包括使用說明文件,請點選此處下載
相關文章
- ArcGIS pro2.3中新增天地圖底圖地圖
- 不偏移的天地圖地圖服務-ArcGIS版地圖
- Arcgis For Android 中MapView 截圖獲取BitmapAndroidView
- nginx代理天地圖做快取解決跨域問題Nginx地圖快取跨域
- 如何載入使用天地圖地圖
- 讀取本地圖片地圖
- 詳解nginx代理天地圖做快取解決跨域問題Nginx地圖快取跨域
- ArcGIS Pro SDK 002 對資料檔案的讀取和操作
- ArcGIS for Android入門程式之DrawTool2.0Android
- NEW!獲取 ArcGIS Pro 與 ArcGIS Desktop 60天試用許可
- 不偏移的天地圖地圖服務-SuperMap版地圖
- 圖論系列之「讀取圖演算法」圖論演算法
- c# 圖片檔案讀取C#
- Excel 讀取圖片並獲取儲存路徑Excel
- SuperMap iClient for Silverlight 載入天地圖client地圖
- python opencv讀取網路圖片PythonOpenCV
- [Android]反射讀取drawable中圖片Android反射
- 03 #### 讀取靜態檔案-圖片
- vue地圖視覺化 ArcGIS篇(3)Vue地圖視覺化
- ArcGIS載入高德、OSM和谷歌等地圖谷歌地圖
- ArcGis api配合vue開發入門系列(一)引入arcgis api以及載入地圖APIVue地圖
- ArcGIS如何自動獲得隨機取樣點?隨機
- 天地圖修改主題顏色修改背景色地圖
- 在讀取資料時拼接圖片域名
- Java 讀取PDF中的文字和圖片Java
- Python如何讀取pdf中的圖片Python
- ArcGIS Pro釋出地圖服務(影像、向量)地圖
- ASP.NET 2.0快取ASP.NET快取
- ArcGIS API for Silverlight中載入Google地形圖(瓦片圖)APIGo
- 使用Adobe Illustrator + ArcGIS繪製地圖 | Map Design Using ArcGIS + Adobe Illustrator地圖
- 精讀《Typescript2.0 - 2.9》TypeScript
- Struts 2.0 解讀筆記筆記
- C# 掃描並讀取圖片中的文字C#
- Java 讀取Word表格中的文字和圖片Java
- Android2.0 如何設定和讀取聯絡人的分組(Group)Android
- 基於ArcGIS API for Javascript的地圖編輯工具APIJavaScript地圖
- ArcGIS API for Silverlight 載入google地圖APIGo地圖
- 論文研究區域圖的製作方法:ArcGIS