- 自定义的Overlay,目的是使所有的点,和连线能刚好的显示在当前地图屏幕区域中
- 使其自动调整地图的图层层级
- 点的个数是不确定
- 如:假设共有100个Latlng,其中,50个点在郑州,20个点在北京,30个点在济南,
- 当前的地图层级应自动调整为刚好显示出这100个点的最小层级,且视角移动到所有点的相对中心经纬度角度
- 效果图如下
首先进行,自定义图层
MyPointOverlay
注释
PoiItem 包含经纬度点和,每个点的文本信息等的实体类。
代码如下:
import android.graphics.Color;
import com.amap.api.maps2d.AMap;
import com.amap.api.maps2d.CameraUpdateFactory;
import com.amap.api.maps2d.model.BitmapDescriptor;
import com.amap.api.maps2d.model.LatLng;
import com.amap.api.maps2d.model.LatLngBounds;
import com.amap.api.maps2d.model.Marker;
import com.amap.api.maps2d.model.MarkerOptions;
import com.amap.api.maps2d.model.PolylineOptions;
import com.amap.api.services.core.PoiItem;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* Created by adminZPH on 2017/3/30.
* 自定义的Overlay,目的是使所有的点,和连线能刚好的显示在当前地图屏幕区域中
* 使其自动调整地图的图层层级
* 点的个数是不确定
* 如:假设共有100个Latlng,其中,50个点在郑州,20个点再北京,30个点在济南,
* 当前的地图层级应自动调整为刚好显示出这100个点的最小层级,且视角移动到所有点的相对中心经纬度角度
*/
public class MyPointOverlay {
private List<PoiItem> a;
private AMap b;
private ArrayList<Marker> c = new ArrayList();
public MyPointOverlay(AMap var1, List<PoiItem> var2) {
this.b = var1;
this.a = var2;
}
/**
* 添加当前的点到地图上
* */
public void addToMap() {
for(int var1 = 0; var1 < this.a.size(); ++var1) {
Marker var2 = this.b.addMarker(this.a(var1));
var2.setObject(Integer.valueOf(var1));
this.c.add(var2);
}
}
/**
* 移除当前的地图上的mark
* */
public void removeFromMap() {
Iterator var1 = this.c.iterator();
while(var1.hasNext()) {
Marker var2 = (Marker)var1.next();
var2.remove();
}
}
/**
* 移动当前的地图层级,到合适的层级
* */
public void zoomToSpan() {
if(this.a != null && this.a.size() > 0) {
if(this.b == null) {
return;
}
LatLngBounds var1 = this.a();
this.b.moveCamera(CameraUpdateFactory.newLatLngBounds(var1, 5));
}
}
/**
* 在地图上把添加的点进行连线
* */
public void AddLineToAmap(){
for (int i=0;i<a.size()-1;++i){
b.addPolyline((new PolylineOptions()).add(
new LatLng(a.get(i).getLatLonPoint().getLatitude(),a.get(i).getLatLonPoint().getLongitude()),
new LatLng(a.get(i+1).getLatLonPoint().getLatitude(),a.get(i+1).getLatLonPoint().getLongitude())
).color(Color.RED).width(2.0f));
}
}
private LatLngBounds a() {
LatLngBounds.Builder var1 = LatLngBounds.builder();
for(int var2 = 0; var2 < this.a.size(); ++var2) {
var1.include(new LatLng(((PoiItem)this.a.get(var2)).getLatLonPoint().getLatitude(), ((PoiItem)this.a.get(var2)).getLatLonPoint().getLongitude()));
}
return var1.build();
}
private MarkerOptions a(int var1) {
return (new MarkerOptions()).position(new LatLng(((PoiItem)this.a.get(var1)).getLatLonPoint().getLatitude(), ((PoiItem)this.a.get(var1)).getLatLonPoint().getLongitude())).title(this.getTitle(var1)).snippet(this.getSnippet(var1)).icon(this.getBitmapDescriptor(var1));
}
protected BitmapDescriptor getBitmapDescriptor(int var1) {
return null;
}
protected String getTitle(int var1) {
return ((PoiItem)this.a.get(var1)).getTitle();
}
protected String getSnippet(int var1) {
return ((PoiItem)this.a.get(var1)).getSnippet();
}
public int getPoiIndex(Marker var1) {
for(int var2 = 0; var2 < this.c.size(); ++var2) {
if(((Marker)this.c.get(var2)).equals(var1)) {
return var2;
}
}
return -1;
}
public PoiItem getPoiItem(int var1) {
return var1 >= 0 && var1 < this.a.size()?(PoiItem)this.a.get(var1):null;
}
}
应用
新建Activity
/**
* @author adminZPH
* 自定义地图Overlay
* 解决经纬度点地图显示适配问题
* */
public class OverlayTestActivity extends AppCompatActivity implements AMap.OnMapLoadedListener {
private MapView mapview;
private AMap aMap;
public static final LatLng position_ZHENGZHOU = new LatLng(34.7461110548, 113.6589270503);
private List<LatLng> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_overlay_test);
initmap(savedInstanceState);
}
/**
* 随机生成30个数据,经纬度都在中国的经纬度范围内
* */
private void initDate() {
list=new ArrayList<>();
for (int i=0;i<30;i++) {
int x = 73 + (int) (Math.random() * 62);
int y = 15 + (int) (Math.random() * 38);
int xx = 100000 + (int) (Math.random() * 100000);
int yy = 100000 + (int) (Math.random() * 100000);
list.add(new LatLng(Double.valueOf(x+"."+xx),Double.valueOf(y+"."+yy)));
}
}
private void initmap(Bundle savedInstanceState) {
mapview= (MapView) findViewById(R.id.overlay_map);
mapview.onCreate(savedInstanceState);
if (aMap == null) {
aMap = mapview.getMap();
mapview.setSelected(true);
setMap();
}
aMap.setOnMapLoadedListener(this);
}
private void setMap() {
aMap.moveCamera(CameraUpdateFactory.zoomTo(17.0f));
CameraUpdate movecity = CameraUpdateFactory.newLatLngZoom(position_ZHENGZHOU,17);
aMap.moveCamera(movecity);
aMap.addMarker(new MarkerOptions().
icon(BitmapDescriptorFactory.fromBitmap(
BitmapFactory.decodeResource(getResources(), R.mipmap.position))).
position(position_ZHENGZHOU));
}
/**
* 方法必须重写
*/
@Override
public void onResume() {
super.onResume();
mapview.onResume();
}
/**
* 方法必须重写
*/
@Override
public void onPause() {
super.onPause();
mapview.onPause();
}
/**
* 方法必须重写
*/
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mapview.onSaveInstanceState(outState);
}
/**
* 当地图加载完后
* */
@Override
public void onMapLoaded() {
initDate();
List<PoiItem> list1=new ArrayList<>();
for (int i=0;i<30;++i) {
LatLonPoint point=new LatLonPoint(list.get(i).latitude,list.get(i).longitude);
PoiItem p=new PoiItem("1",point,null,null);
list1.add(p);
}
MyPointOverlay myPointOverlay=new MyPointOverlay(aMap,list1);
myPointOverlay.removeFromMap();
myPointOverlay.addToMap();
myPointOverlay.zoomToSpan();
myPointOverlay.AddLineToAmap();
}
}
xml布局文件如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="zph.zhjx.com.chat.ui.OverlayTestActivity">
<com.amap.api.maps2d.MapView
android:id="@+id/overlay_map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="true"
>
</com.amap.api.maps2d.MapView>
</RelativeLayout>
以上可以完美的解决N个点在高德地图中刚好显示在地图控件屏幕中的问题,具体的业务逻辑根据需求去改动,本文仅供参考,更多详细可以参考高德地图源码SDK或留言。
这片海 2017.03.30-郑州