为什么天谷歌地图 偏移可以不偏移

1717人阅读
ArcGIS(3)
天地图2.0()于2013年3月份上线,基本情况如下:
1)&&&&&基于OGC的WMTS 1.0.0版本;
2)&&&&&提供矢量地图、影像地图和地形图;
3)&&&&&提供两种坐标系:国家2000大地坐标系和Web Mercator投影坐标系;
4)&&&&&地图和标注数据分开,矢量地图和影像地图提供中英文标注,地形图仅提供中文标注。
ArcGIS接口可以灵活扩展支持天地图。本文是以ArcGIS Runtime SDK for&为例说明如何扩展来加载天地图的。其它产品,比如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.656E8,
&&&&&&&&&&&& 1.828E8, 7.14E7, 3.07E7,
&&&&&&&&&&&& 1.035E7, 588,
&&&&&&&&&&&& 397, 8721985,
&&&&&&&&&&&& .,
&&&&&&&&&&&& 0., 53102,
&&&&&&&&&&&& 7. };
(2)分辨率
//&墨卡托坐标系下的分辨率
private&static&final&double[]&RESOLUTIONS_MERCATOR&=
&&&&&&&&&&&& 0., 0256,
&&&&&&&&&&&& ., 6282,
&&&&&&&&&&&& 611., 305., 152.5,
&&&&&&&&&&&& 76.25, 38.13, 19.063,
&&&&&&&&&&&& 9.032, 4.516, 2.758,
&&&&&&&&&&&& 1.879, 0.9395 };
//&国家2000坐标系下的分辨率
private&static&final&double[]&RESOLUTIONS_2000&=
&&&&&&&&&&&& 0.997, 0.00014,
&&&&&&&&&&&& 0.0007, 0.00002,
&&&&&&&&&&&& 0.50009,
&&&&&&&&&&&& 0..9062495,
&&&&&&&&&&&& 0..,
&&&&&&&&&&&& 0., 0.,
&&&&&&&&&&&& 0., 0.};
(3)起始点
//&国家2000坐标系下的起始点
private&static&final&Point&ORIGIN_2000&=new&Point(-180,
//&墨卡托坐标系下的起始点
private&static&final&Point&ORIGIN_MERCATOR&=new&Point(-7892,
&&&&&&&&&&&& 7892);
(4)地图范围
//&国家2000坐标系下的地图范围
private&static&final&double&X_MIN_2000&=
private&static&final&double&Y_MIN_2000&=
private&static&final&double&X_MAX_2000&=
private&static&final&double&Y_MAX_2000&=
//&墨卡托坐标系下的地图范围
private&static&final&double&X_MIN_MERCATOR&=
private&static&final&double&Y_MIN_MERCATOR&=
private&static&final&double&X_MAX_MERCATOR&=
private&static&final&double&Y_MAX_MERCATOR&=
有了以上信息,通过扩展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);
使用扩展后的TianDiTuLayer加载天地图,与业务数据叠加效果图如下所示:
ArcGIS接口可以灵活扩展。以上是以ArcGIS Runtime SDK for Android为例说明如何扩展来加载天地图。其它接口,比如Web APIs、Native SDKs、Portal for ArcGIS、桌面都可以通过类似的方式实现扩展。
想扩展源码及示例,包括使用说明文档,&
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:61885次
排名:千里之外
原创:17篇
转载:38篇
评论:10条
(1)(8)(3)(1)(2)(1)(3)(4)(4)(1)(1)(2)(1)(2)(1)(1)(3)(8)(1)(8)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
请问使用ArcMap进行数字化,加载天地图WMTS服务作为底图时,会出现明显的偏离。网上说是DPI不一致造成的,请问有解决的方法吗。
需要安装插件,需要向购买产品时的销售索要。
网络地图的坐标都是人为添加过误差的,和你精确的地图不可能完全套合。除非你对其中一个进行纠偏。
要回复问题请先或
关注: 3 人博客分类:
现在智能机跟移动互联网的飞速发展,给移动开发者带来了前所未有的机遇,大量的移动APP问世,这其中与手机相关性最大的莫过于LBS相关APP了,移动终端与PC最大的区别无非在于:便携移动性所带来的随时随地访问,还有一点就是GPS定位,传统的PC只能通过IP来源大致取得用户城市等相关信息,但是移动终端上这得到了解决。
在开发LBS相关APP的过程中,总会遇到这么一个头疼的问题:如何选择地图及地图偏移问题.今天就个人所做项目中总结的经验来给大家分享一下关于这两个问题的解决:
1.地图选择
如何选择地图,个人觉得可以从以下几点考虑:
(1).定位准确度及定位消耗时间,哪个高,哪个快.
定位位置的工作机理是这样,首先通过wifi网络(最准确),基站,GPS定位用户的位置数据(一般是经纬度表示),
然后上传服务器,服务器对比后,下发定位的具体位置(比如迈克龙),然后打包整个信息发送给对方。对方收取
后,拿着位置去地图读数据。位置信息同样拉取(或者前者直接发送位置信息)。
(2).POI位置信息是否提供,数量级?(比如 mapbar地图POI数据3000万)
POI是“Point of Interest”的缩写,可以翻译成“兴趣点”吧,每个POI包含四方面信息,名称、类别、经度、纬度。
不同的地图搜集的POI数量是不同的, 影响的结果就是,在地图上能够显示“迈克龙”,而不是“南六道”。
(3).地图路径算法,哪个地图快,准确.提供的路径方式多.
这个是为了导航使用的,来源取自于导航数据。
(4).是否提供3D或者卫星方式?
提供更多的体验方式
(5).用户体验 ,启动速度,定位精准度。
流畅度,以及地图实现方式,矢量地图or栅格。googlemaps用的是栅格地图,而高德则是使用的矢量。矢量的好处是边下载,边编译,边展示。
(6).api使用难易度(这个貌似现在都差不多了,跟google兼容性比较好,可替换性很强,基本只要换个包就可以了)
(7).地图校正算法(百度地图等国内具有地图资质的地图提供商是不需要做纠偏,但是Google地图是需要的)
(8).包大小(如果一个地图jar或者so库过大,势必给应用带来更大的体积,虽然说不要纠结于几百K的大小,但是本着
能减小包大小就尽量减小的前提,还是有用的,比如Google地图在android手机上是不需要加载包的,相比百度地图可以省200多K)
(9).地图表示范围:是否有国外地图(例如,google地图拥有全球大多数国家的地图数据,而国内的百度地图等仅仅只有
国内的地图数据)
基于以上9点我觉得大家应该可以选择出一个合适的地图,我自己用的时候,是做一款IM产品里边有一个发送位置的功
能,中间有一个发送位置的功能,对于这个产品而言,其有几个特点:
1.APP在没有添加发送位置的情况下,包的大小已经达到7M了,对于android移动APP来说,这个大小已经算很大了,对于移动2G用户升级,或者流量偏少的用户而言,每次升级是一个很痛苦的过程,所以要慎重选择地图库。
2.由于这个APP定位是全球的,或者至少不仅仅是国内,所以基本排除了国内的地图服务提供商,或许有人会说,你怎么不国内选用国内的地图厂商,国外的版本选用国外的地图提供商,这里我只能说,对于开发者而言,能只维护一份代码,比维护多份好。
3.综合比较google地图跟百度地图在android机器上的表现来看,Google地图在整体用户体验上比百度地图好一个档次,包括启动加载速度,地图移动,放大,缩小等操作的流畅度等。
4.也许有人会说Google地图是国外的,Google跟中国政府的关系,会不会有Google地图加载速度比百度地图慢,或者Google地图被封的可能,这里我观察了目前大多数比较有名的移动APP,包括QQ2012,微信(4.0以前版本)等均是采用Google地图,所以这点大家不用担心。
基于以上几点最后选择了Google地图。(附件是个人APP)
关于如何解决Google地图存在的地图偏移,见下一篇。
下载次数: 37
浏览: 75077 次
来自: 深圳
测试证书:https://www.washington.edu ...
你这个证书是本地写死到assert路径下的,安全吗?我觉得本地 ...
initSSLWithHttpClinet 这个方法在哪里?
CustomParameter.ENCODECustomPar ...
直接 buff.replaceAll(&[^\u4E ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'天地图数据解决方案_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
天地图数据解决方案
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩24页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢}

我要回帖

更多关于 谷歌地图偏移补丁 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信