ArcGIS读取天地图V1.1

更新时间:2023-08-06 11:00:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

解决天地图叠加数据偏移情况

ArcGIS读取天地图

1.天地图概况

天地图2.0(http://www.77cn.com.cn)于2013年3月份上线,基本情况如下:

1)基于OGC的WMTS 1.0.0版本;

2)提供矢量地图、影像地图和地形图;

3)提供两种坐标系:国家2000大地坐标系和Web Mercator投影坐标系;

4)地图和标注数据分开,矢量地图和影像地图提供中英文标注,地形图仅

提供中文标注。

所以,天地图提供了16个服务地址,如下表所示:

表格1天地图2.0服务地址

解决天地图叠加数据偏移情况

2.ArcGIS WMTS接口访问天地图

ArcGIS产品,包括桌面产品、Web APIs、Native SDKs都提供了对WMTS 的支持。如此,可以通过这些接口来访问天地图的WMTS服务。但是实际情况要复杂一些,经过测试发现,使用ArcGIS的WMTS接口访问天地图,会出现偏差,如下图所示。

经过研究发现,产生偏差的根本原因在于:ArcGIS WMTS接口中使用的DPI 与天地图使用的DPI不一致。

解决天地图叠加数据偏移情况

OGC WMTS标准中规定,通过getcapatilities请求可以获得WMTS的元数据。上图是天地图2.0WMTS元数据的部分截图(XML格式)。元数据中包含各个级别的比例尺数据(如图中红框内容)。在访问WMTS时,需要通过这些元数据计算出分辨率,公式如下所示。

Scale=1:(Resolution?

DPI 0.0254)

OGC WMTS规范中DPI采用90.71(即采用0.028mm作为一个像素的物理宽度),而天地图使用的DPI采用国家标准规定的96(见《电子地图规范》)。由于ArcGIS WMTS接口实现均遵循OGC WMTS标准,使用90.71作为DPI来计算分辨率,导致ArcGIS通过WMTS接口访问天地图时,图片物理尺寸变大,使得地图看上去向右下方偏移。

3.扩展ArcGIS接口访问天地图(以ArcGIS Runtime SDK for

Android为例)

在第2小结,分析了用ArcGIS WMTS接口访问天地图产生偏移的原因,那么就可以有针对性的对ArcGIS接口进行扩展,来实现对天地图的访问。

ArcGIS接口可以扩展。以ArcGIS Runtime SDK for Android为例,提供了TiledServiceLayer类。这是访问切片服务的基础类,通过扩展这个类,就可以访问天地图的WMTS服务了。扩展之前,需要了解一下天地图服务的一些参数,包括:

1)比例尺:

2)分辨率:

解决天地图叠加数据偏移情况

3)起始点:

4)地图范围:

有了以上信息,通过扩展TiledServiceLayer,就可以访问天地图了,核心代码如下所示:

TianDiTuLayer.java

解决天地图叠加数据偏移情况

public TianDiTuLayer(int layerType) {

super(true);

http://www.77cn.com.cnyerInfo = LayerInfoFactory.getLayerInfo(layerType);

this.init();

}

privatevoid init() {

try {

getServiceExecutor().submit(new Runnable() {

publicvoid run() {

TianDiTuLayer.this.initLayer();

}

});

} catch (RejectedExecutionException rejectedexecutionexception) { Log.e("ArcGIS", "initialization of the layer failed.",

rejectedexecutionexception);

}

}

protectedbyte[] getTile(int level, int col, int row) throws Exception { if (level >layerInfo.getMaxZoomLevel()

|| level <layerInfo.getMinZoomLevel())

returnnewbyte[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);

}

protectedvoid 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

解决天地图叠加数据偏移情况

以下代码说明如何使用扩展后的TianDiTuLayer来显示天地图服务。

使用扩展后的TianDiTuLayer加载天地图,与业务数据叠加效果图如下所示:

4.总结

ArcGIS接口可以灵活扩展。以上是以ArcGIS Runtime SDK for Android为例说明如何扩展来加载天地图。其它接口,比如Web APIs、Native SDKs、Portal、

解决天地图叠加数据偏移情况

桌面都可以通过类似的方式实现扩展。

本文来源:https://www.bwwdw.com/article/pnyj.html

Top