ArcGIS读取天地图
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
提供中文标注。 所以,天地图提供了 16 个服务地址,如下表所示:
表格 1 天地图 2.0 服务地址
数据类型 矢量
投影方式 国家 2000
矢量中文标注 国家 2000
矢量英文标注 国家 2000
影像
国家 2000
影像中文标注 国家 2000
影像英文标注 国家 2000
地形
国家 2000
地形标注
国家 2000
于 ArcGIS WMTS 接口实现均遵循 OGC WMTS 标准,使用 90.71 作为 DPI 来计
算分辨率,导致 ArcGIS 通过 WMTS 接口访问天地图时,图片物理尺寸变大,
使得地图看上去向右下方偏移。
3. 扩展 ArcGIS 接口访问天地图(以 ArcGIS Runtime SDK for Android 为例)
ArcGIS 读取天地图
1. 天地图概况
天地图 2.0()于 2013 年 3 月份上线,基本情况 如下:
1) 基于 OGC 的 WMTS 1.0.0 版本; 2) 提供矢量地图、影像地图和地形图; 3) 提供两种坐标系:国家 2000 大地坐标系和 Web Mercator 投影坐标系; 4) 地图和标注数据分开,矢量地图和影像地图提供中英文标注,地形图仅
3) 起始点:
// 国家2000坐标系下的起始点 private static final Point ORIGIN_2000 = new Point(-180, 90); // 墨卡托坐标系下的起始点 private static final Point ORIGIN_MERCATOR = new Point(-20037508.3427892,
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 };
}
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);
经过研究发现,产生偏差的根本原因在于:ArcGIS WMTS 接口中使用的 DPI 与天地图使用的 DPI 不一致。
OGC WMTS 标准中规定,通过 getcapatilities 请求可以获得 WMTS 的元数据。
上图是天地图 2.0 WMTS 元数据的部分截图(XML 格式)。元数据中包含各个级
地形标注
Web Mercator /cta_w/wmts
2. ArcGIS WMTS 接口访问天地图
ArcGIS 产品,包括桌面产品、Web APIs、Native SDKs 都提供了对 WMTS 的支持。如此,可以通过这些接口来访问天地图的 WMTS 服务。但是实际情况 要复杂一些,经过测试发现,使用 ArcGIS 的 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 };
别的比例尺数据(如图中红框内容)。在访问 WMTS 时,需要通过这些元数据计
算出分辨率,公式如下所示。
Scale
=
1:(Resolution
∗
DPI 0.0254
)
OGC WMTS 规范中 DPI 采用 90.71(即采用 0.028mm 作为一个像素的物理
宽度),而天地图使用的 DPI 采用国家标准规定的 96(见《电子地图规范》)。由
// 国家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};
在第 2 小结,分析了用 ArcGIS WMTS 接口访问天地图产生偏移的原因,那 么就可以有针对性的对 ArcGIS 接口进行扩展,来实现对天地图的访问。
ArcGIS 接口可以扩展。以 ArcGIS Runtime SDK for Android 为例,提供了 TiledServiceLayer 类。这是访问切片服务的基础类,通过扩展这个类,就可以访 问天地图的 WMTS 服务了。扩展之前,需要了解一下天地图服务的一些参数, 包括:
public TianDiTuLayer(int layerType) { super(true); yerInfo = LayerInfoFactory.getLayerInfo(layerType); this.init();
}
private void init() { try { getServiceExecutor().submit(new Runnable() { public void run() { TianDiTuLayer.this.initLayer(); } }); } catch (RejectedExecutionException rejectedexecutionexception) { Log.e("ArcGIS", "initialization of the layer failed.", rejectedexecutionexception); }
有了以上信息,通过扩展 TiledServiceLayer,就可以访问天地图了,核心代 码如下所示:
TianDiTuLayer.java
public class TianDiTuLayer extends TiledServiceLayer {
private TianDiTuLayerInfo layerInfo;
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;
矢量
Web Mercator
矢量中文标注 Web Mercator
矢量英文标注 Web Mercator
影像
Web Mercator
影像中文标注 Web Mercator
影像英文标注 Web Mercator
地形
Web Mercator
服务地址 /vec_c/wmts /cva_c/wmts /eva_c/wmts /img_c/wmts /cia_c/wmts /eia_c/wmts /ter_c/wmts /cta_c/wmts /vec_w/wmts /cva_w/wmts /eva_w/wmts /img_w/wmts /cia_w/wmts /eia_w/wmts /ter_w/wmts
表格 1 天地图 2.0 服务地址
数据类型 矢量
投影方式 国家 2000
矢量中文标注 国家 2000
矢量英文标注 国家 2000
影像
国家 2000
影像中文标注 国家 2000
影像英文标注 国家 2000
地形
国家 2000
地形标注
国家 2000
于 ArcGIS WMTS 接口实现均遵循 OGC WMTS 标准,使用 90.71 作为 DPI 来计
算分辨率,导致 ArcGIS 通过 WMTS 接口访问天地图时,图片物理尺寸变大,
使得地图看上去向右下方偏移。
3. 扩展 ArcGIS 接口访问天地图(以 ArcGIS Runtime SDK for Android 为例)
ArcGIS 读取天地图
1. 天地图概况
天地图 2.0()于 2013 年 3 月份上线,基本情况 如下:
1) 基于 OGC 的 WMTS 1.0.0 版本; 2) 提供矢量地图、影像地图和地形图; 3) 提供两种坐标系:国家 2000 大地坐标系和 Web Mercator 投影坐标系; 4) 地图和标注数据分开,矢量地图和影像地图提供中英文标注,地形图仅
3) 起始点:
// 国家2000坐标系下的起始点 private static final Point ORIGIN_2000 = new Point(-180, 90); // 墨卡托坐标系下的起始点 private static final Point ORIGIN_MERCATOR = new Point(-20037508.3427892,
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 };
}
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);
经过研究发现,产生偏差的根本原因在于:ArcGIS WMTS 接口中使用的 DPI 与天地图使用的 DPI 不一致。
OGC WMTS 标准中规定,通过 getcapatilities 请求可以获得 WMTS 的元数据。
上图是天地图 2.0 WMTS 元数据的部分截图(XML 格式)。元数据中包含各个级
地形标注
Web Mercator /cta_w/wmts
2. ArcGIS WMTS 接口访问天地图
ArcGIS 产品,包括桌面产品、Web APIs、Native SDKs 都提供了对 WMTS 的支持。如此,可以通过这些接口来访问天地图的 WMTS 服务。但是实际情况 要复杂一些,经过测试发现,使用 ArcGIS 的 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 };
别的比例尺数据(如图中红框内容)。在访问 WMTS 时,需要通过这些元数据计
算出分辨率,公式如下所示。
Scale
=
1:(Resolution
∗
DPI 0.0254
)
OGC WMTS 规范中 DPI 采用 90.71(即采用 0.028mm 作为一个像素的物理
宽度),而天地图使用的 DPI 采用国家标准规定的 96(见《电子地图规范》)。由
// 国家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};
在第 2 小结,分析了用 ArcGIS WMTS 接口访问天地图产生偏移的原因,那 么就可以有针对性的对 ArcGIS 接口进行扩展,来实现对天地图的访问。
ArcGIS 接口可以扩展。以 ArcGIS Runtime SDK for Android 为例,提供了 TiledServiceLayer 类。这是访问切片服务的基础类,通过扩展这个类,就可以访 问天地图的 WMTS 服务了。扩展之前,需要了解一下天地图服务的一些参数, 包括:
public TianDiTuLayer(int layerType) { super(true); yerInfo = LayerInfoFactory.getLayerInfo(layerType); this.init();
}
private void init() { try { getServiceExecutor().submit(new Runnable() { public void run() { TianDiTuLayer.this.initLayer(); } }); } catch (RejectedExecutionException rejectedexecutionexception) { Log.e("ArcGIS", "initialization of the layer failed.", rejectedexecutionexception); }
有了以上信息,通过扩展 TiledServiceLayer,就可以访问天地图了,核心代 码如下所示:
TianDiTuLayer.java
public class TianDiTuLayer extends TiledServiceLayer {
private TianDiTuLayerInfo layerInfo;
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;
矢量
Web Mercator
矢量中文标注 Web Mercator
矢量英文标注 Web Mercator
影像
Web Mercator
影像中文标注 Web Mercator
影像英文标注 Web Mercator
地形
Web Mercator
服务地址 /vec_c/wmts /cva_c/wmts /eva_c/wmts /img_c/wmts /cia_c/wmts /eia_c/wmts /ter_c/wmts /cta_c/wmts /vec_w/wmts /cva_w/wmts /eva_w/wmts /img_w/wmts /cia_w/wmts /eia_w/wmts /ter_w/wmts