百度、google、⾼德地图⽐例尺功能实现(算法地图分辨率和
zoomlevel之间的关系)
百度、google、⾼德地图⽐例尺功能实现(算法&&地图分辨率和zoomlevel之间的关系)
⼀、什么是⽐例尺?
⽐例尺是表⽰⽐实地距离缩⼩的程度,因此也叫。⽤公式表⽰为:⽐例尺=/实地距离。
例如地图上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,定义⼀个要显⽰⽐例尺数值的数组:
1. public static final int[] SCALE = { 1, 20, 50, 100, 200, 500, 1000, 2000,
2. 5000, 10000, 20000, 25000, 50000, 100000, 200000, 500000, 1000000,
3. 2000000, 5000000 };
好久不见 陈奕迅2-2 在当前地图Activity中实现 MKMapViewListener 接⼝,覆盖其中的⽅法,并设置监听:
1. @Override
2. public void onClickMapPoi(MapPoi arg0) {
3. }
4.
5. @Override
6. public void onGetCurrentMap(Bitmap arg0) {
7. }
8.
韩国与朝鲜
1. //当地图完成缩放,移动等动画效果后,回调此⽅法
2. @Override
养老金怎么计算3. public void onMapAnimationFinish() {
1. showScaleView();
2.
3. }
4.
5. @Override
6. public void onMapMoveFinish() {
7. }
2-3 声明并实例化组件:
1. protected View mScaleView;
2. protected int mScaleMaxWidth;
3. protected int mScaleMaxHeight;
4. protected TextView mScaleTextView;
5. protected ImageView mScaleImageView;
1. mScaleView = getLayoutInflater().inflate(R.layout.main_scale, null);
2. LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT,
3. LayoutParams.WRAP_CONTENT);
4. layoutParams.setMargins(10, 10, 0, 0);
5. mScaleView.setLayoutParams(layoutParams);
6.
7. mScaleTextView = (TextView) mScaleView.findViewById(R.id.scale_text);
8. mScaleImageView = (ImageView) mScaleView.findViewById(R.id.scale_image);
2-4 main_scale,xml
1. <?xml version="1.0" encoding="utf-8"?>
2. <LinearLayout xmlns:android="schemas.android/apk/res/android"
3. android:layout_width="wrap_content"
4. android:layout_height="wrap_content"
5. android:orientation="vertical" >
6.
爱就一个字歌词
7. <TextView
8. android:id="@+id/scale_text"
9. android:layout_width="wrap_content"
0. android:layout_height="wrap_content"
1. android:layout_gravity="center"
2. android:singleLine="true"
3. android:textColor="@color/text_black" />
14.
5. <ImageView
6. android:id="@+id/scale_image"
殷桃的现任丈夫7. android:layout_width="match_parent"
8. android:layout_height="wrap_content"
9. android:background="@drawable/scale"
0. android:contentDescription="@null" />
21.
2. </LinearLayout>
2-5,showScaleView()
哦累累1. /** 计算两处经纬度的实际距离并换算成实际⽐例尺单位 */
2. public void showScaleView() {
3.
4. //获取设置默认屏幕宽度480
5. int default_screen_width = Resources()
6. .getDimensionPixelSize(R.dimen.default_screen_width);
7. //获取设置默认屏幕⾼度800
8. int default_screen_height = Resources()
9. .getDimensionPixelSize(R.dimen.default_screen_height);
0. //mScaleMaxWidth = 默认屏幕宽度四分之⼀
1. mScaleMaxWidth = default_screen_width>>2;
2. //mScaleMaxHeight = 默认屏幕⾼度⼆分之⼀
3. mScaleMaxHeight = default_screen_height>>1;
14.
5. //转换为起点的经纬度GeoPoint
6. GeoPoint fromGeopoint = Projection().fromPixels(0,
7. mScaleMaxHeight);
8. //转换为终点的经纬度GeoPoint
9. GeoPoint toGeopoint = Projection().fromPixels(
0. mScaleMaxWidth, mScaleMaxHeight);
1. //通过getDistance函数得出两点间的真实距离
2. double distance = Distance(fromGeopoint, toGeopoint);
23.
4. String discripition = null;
5. int dis = 0;