一、什么是比例尺?

比例尺是表示图上距离比实地距离缩小的程度,因此也叫缩尺。用公式表示为:比例尺=图上距离/实地距离。

例如地图上1厘米代表实地距离500千米,可写成:1∶50,000,000或写成:1/50,000,000。

在当前移动端或是web端地图上显示:

baidu

 google

图中的公里或英里数会随着黑条宽度的改变而改变,并且它的数值和地图当前区域的地图图层分辨率和缩放等级有关。浅显的来看,拿百度地图举例,百度地图移动端地图缩放等级分为:3-21,也就是19个等级,在同一缩放等级下,无论你移动到世界的每一个角落,比例尺的数值,公里\米 都是一样的。反之,googl地图就不一样,在同一缩放等级下,移动到世界不同的区域,显示的公里\ 英里 数值是不一样的,以赤道为中心,向两级延伸。google真正做到了球形的地球,而百度缩放到世界地图,你会看到整个地球是一张纸:

先看看google地图:

以下是百度地图:

二、移动端的实现

大家无论使用ios还是Android的,会发现,三个地图api,有的提供了比例尺组件,有的没有,所以,只能我们自己来实现,接下来我就说一下如何实现,以百度地图android版(v2.1.2)为例。

首先简单说一下实现原理:

获取屏幕上两个点的位置坐标(中心点为起点,终点的x坐标为设计的比例尺最宽宽度),通过这两个点的图上坐标转换为真实经纬度,然后使用地图api提供的两点之间真是距离的函数,算出真实距离,即为当前缩放等级下,代表的大概比例尺数值。

2-1,定义一个要显示比例尺数值的数组:

public static final int[] SCALE = { 1, 20, 50, 100, 200, 500, 1000, 2000,

5000, 10000, 20000, 25000, 50000, 100000, 200000, 500000, 1000000,

2000000, 5000000 };

2-2 在当前地图Activity中实现 MKMapViewListener 接口,覆盖其中的方法,并设置监听:

mMapView.regMapViewListener(mBMapManager, this);

@Override

public void onClickMapPoi(MapPoi arg0) {

}

@Override

public void onGetCurrentMap(Bitmap arg0) {

}

//当地图完成缩放,移动等动画效果后,回调此方法

@Override

public void onMapAnimationFinish() {

showScaleView();

}

@Override

public void onMapMoveFinish() {

}

2-3 声明并实例化组件:

protected View mScaleView;

protected int mScaleMaxWidth;

protected int mScaleMaxHeight;

protected TextView mScaleTextView;

protected ImageView mScaleImageView;

mScaleView = getLayoutInflater().inflate(R.layout.main_scale, null);

LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT,

LayoutParams.WRAP_CONTENT);

layoutParams.setMargins(10, 10, 0, 0);

mScaleView.setLayoutParams(layoutParams);

mScaleTextView = (TextView) mScaleView.findViewById(R.id.scale_text);

mScaleImageView = (ImageView) mScaleView.findViewById(R.id.scale_image);

2-4 main_scale,xml

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:orientation="vertical" >

android:id="@+id/scale_text"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center"

android:singleLine="true"

android:textColor="@color/text_black" />

android:id="@+id/scale_image"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:background="@drawable/scale"

android:contentDescription="@null" />

2-5,showScaleView()

/** 计算两处经纬度的实际距离并换算成实际比例尺单位 */

public void showScaleView() {

//获取设置默认屏幕宽度480

int default_screen_width = this.getResources()

.getDimensionPixelSize(R.dimen.default_screen_width);

//获取设置默认屏幕高度800

int default_screen_height = this.getResources()

.getDimensionPixelSize(R.dimen.default_screen_height);

//mScaleMaxWidth = 默认屏幕宽度四分之一

mScaleMaxWidth = default_screen_width>>2;

//mScaleMaxHeight = 默认屏幕高度二分之一

mScaleMaxHeight = default_screen_height>>1;

//转换为起点的经纬度GeoPoint

GeoPoint fromGeopoint = mMapView.getProjection().fromPixels(0,

mScaleMaxHeight);

//转换为终点的经纬度GeoPoint

GeoPoint toGeopoint = mMapView.getProjection().fromPixels(

mScaleMaxWidth, mScaleMaxHeight);

//通过getDistance函数得出两点间的真实距离

double distance = DistanceUtil.getDistance(fromGeopoint, toGeopoint);

String discripition = null;

int dis = 0;

int width = 20;

//出于百度地图缩放最小为世界地图时,以纸的形式展现,这里强制规定如果zoomlevel=最高级

//比例尺数值恒定wie:2000公里,黑条宽度恒定为52像素,缩放最大时同样的道理,如果是google

//地图,不需要if和 else if

if (mMapView.getZoomLevel() == 19) {

dis = Constants.SCALE[1];

width = 52;

} else if (mMapView.getZoomLevel() == 3) {

dis = Constants.SCALE[17];

width = 80;

} else {

//真实距离和数组中相近的两个值循环比较,以小值为准,得出规定好的比例尺数值赋值给dis

for (int j = 1; j

if (Constants.SCALE[j - 1] <= distance

&& distance

dis = Constants.SCALE[j - 1];

break;

}

}

//比例尺黑条的宽度 =(dis*默认屏幕宽度四分之一)/真实的距离

width = (int) (dis * mScaleMaxWidth / distance);

}

//如果比例尺数值大于1000,则discripition = 2500 km(公里),否则 为 900 m(米)

if (dis >= 1000) {

discripition = dis / 1000 + getString(R.string.units_km);

} else {

discripition = dis + getString(R.string.units_m);

}

//设置TextView组件要显示的比例尺数值

mScaleTextView.setText(discripition);

//设置比例尺黑条ImageView的的长度

android.view.ViewGroup.LayoutParams lp = mScaleImageView

.getLayoutParams();

lp.width = width;

mScaleImageView.setLayoutParams(lp);

}

至此,代码部分就结束了,咱们看一下运行效果

如果你想要实时的动态效果,也就是说双指触控到屏幕(缩放地图)时,(手指未离开)就不断变化比例尺,就不能写在onMapAnimationFinish回调函数内了,因为它不是实时调用,只有当每次动画结束后(双指也离开屏幕了),才会调用;那就覆盖onTouchEvent方法:

@Override

public boolean onTouchEvent(MotionEvent arg0) {

showScaleView();

return super.onTouchEvent(arg0);

}

这样,每当手指触摸到屏幕,就会实时调用算法啦。不过看样子cpu应该会很累的。

至于google和高德地图,把showScaleView()写在其地图缩放的回调函数内即可,google的好像是 onCameraChange();

三、结尾

到此,比例尺的功能就被我们自己实现了,这个算法不知道算不算严格的科学,但是至少应该不会差很多,如果谁有同样的兴趣,欢迎和我一起探讨噢。

yang

20130718

地图比例尺与空间分辨率之间的关系_百度、google、高德 地图比例尺功能实现(算法地图分辨率和zoomlevel之间的关系)...相关推荐

  1. 光通量发光强度照度亮度关系_什么是光通量、光强、亮度和照度?它们之间的关系是什么?...

    光学常用的物理量量有四个:发光强度.光通量.照度.亮度.这四个量尽管是相关的,但各不相同的,不能相混.正像压力.重力.压强.质量是不同的物理量一样. 光通量是表示光源整体亮度的指标,单位流明(lm), ...

  2. pvid与access的关系_关于Trunk、Hybrid、Access、Tag、Untag、Pvid的关系与区别

    关于Trunk.Hybrid.Access.Tag.Untag.Pvid的关系与区别 一.相关定义 1.Trunk口,Trunk口上可以同时传送多个VLAN的包,一般用于交换机之间的链接. 2.Hyb ...

  3. 债券价格和到期收益率的关系_[债券知识]什么是到期收益率?到期收益率与债券价格的关系 - 南方财富网...

    什么是到期收益率?到期收益率与债券价格的关系 在投资市场上,有许多的专业术语需要投资者进行学习,对于债券基本知识,也需要我们去了解,比如什么是到期收益率?债券价格与到期收益率有什么关系?以下就是对这些 ...

  4. pvid与access的关系_关于Trunk、Hybrid、Access、Tag、Untag、Pvid的关系

    一.相关定义 1.Trunk口,Trunk口上可以同时传送多个VLAN的包,一般用于交换机之间的链接. 2.Hybrid口,Hybrid口上可以同时传送多个VLAN的包,一般用于交换机之间的链接或交换 ...

  5. python 两点之间的距离_手把手教你HTML5实现根据LBS定位到商家两点之间距离多少...

    转载链接:https://juejin.im/post/5e7e126b51882573c508be13 背景 最近在做一个类似支付宝口碑商家的功能模块,其中有个功能就是计算出用户与商家的距离,如下图 ...

  6. B-tree vs hash_我思故我在_百度空间

    B-tree vs hash_我思故我在_百度空间 B-tree vs hash_我思故我在_百度空间 B-tree vs hash B-tree相对于普通的有序树,它有两个优点,一是它的复杂度天然就 ...

  7. 采样频率和带宽的关系_基于矢量网络分析仪的 TDR 与传统采样示波器 TDR 之间的测量性能和优势比较...

    最近几年随着多 Gbps 传输的普及,数字通信标准的比特率也在迅速提升.比特率的提高使得在传统数字系统中不曾见过的问题显现了出来.诸如反射和损耗的问题会造成数字信号失真,导致出现误码.另外由于保证器件 ...

  8. 简述机器指令与微指令之间的关系_技术动态 | 跨句多元关系抽取

    第一部分 概述 关系抽取简介 关系抽取是从自由文本中获取实体间所具有的语义关系.这种语义关系常以三元组 <E1,R,E2> 的形式表达,其中,E1 和E2 表示实体,R 表示实体间所具有的 ...

  9. arcgis两点之间连线_使用ArcGIS制作城市关系强度图(附数据下载)

    规划或地理等相关专业的同学可能会遇到城市关系强度图的制作.我们主要介绍制图部分,至于城市间关系强度如何计算,请左转自行查文献或相关资料学习. ArcMap中有个XY转线(XY to Line)的GP工 ...

  10. opencv和python是什么关系_使用OpenCV和Python检测眼睛

    今天,我们将学习如何借助称为霍夫变换的技术来检测图像中的直线和圆. 什么是霍夫空间? 在开始对图像应用霍夫变换之前,我们需要了解霍夫空间是什么,我们将通过示例的方式来学习. 参数空间 当我们处理图像时 ...

最新文章

  1. life science 研究领域之生物信息学
  2. Emacs支持gomodifytags
  3. 根据当前时间判断上午好、下午好
  4. “万能钥匙”可以打开大脑:脑刺激个性化医疗的新领域
  5. Delphi编程技术简介
  6. [O365] Azure Active Directory Sync EVENT ID 906 FAILED While Purging Run History. Invalid Namespace
  7. 我的第一个安卓应用程序_今天,我启动了我的第一个移动应用程序。 这是我学到的...
  8. 小米MIX 4真机亮屏谍照曝光:四边框极窄,震撼
  9. 1.6 万亿参数你怕了吗?谷歌大脑语言模型速度是 T5 速度的 7 倍
  10. ssh 使用公钥登录客户端设置
  11. CSS3 transform对fixed元素造成的影响笔记
  12. Android网络多线程断点续传下载
  13. gmm聚类python_聚类算法GMM和KMeans?
  14. 【毕业设计】基于stm32的语音识别 - 单片机 嵌入式 物联网 语音识别
  15. 是否应该删除Windows 7 Service Pack备份文件以节省空间?
  16. nltk包下载慢的解决方案(总结)
  17. 什么是MT4软件?炒汇MT4软件有哪些功能和特点?
  18. 手写sql语句面试题
  19. 自动化测试的定位以及一些思考是什么样的,你知道吗?
  20. Jupyter notebook无法执行代码

热门文章

  1. 卸载 Notepad++ !事实已证明,它更牛逼……
  2. ThreadPoolExecutor源码分析
  3. 数据分析-PART1--数据获取和步骤
  4. 青云mysql_青云分布式数据库RadonDB 深度兼容MySQL
  5. 冷门节日借势营销策略分析
  6. 雷电3菊链功能_雷电3接口是什么
  7. arduino麦轮转弯程序_麦克纳姆轮全向轮战车程序精髓分享
  8. 《阿特拉斯耸耸肩》节选:互害与甩锅的反敏捷组织
  9. css模糊遮罩效果_遮罩效果 css3
  10. Kickstart自动化安装平台