Android 高德地图,N个经纬度点(线),刚好显示地图中

  • 自定义的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-郑州

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值