android 自定义地图标注,android 高德地图 自定义图层 路线规划 自定义marker

import java.util.ArrayList; import java.util.List;

import android.content.Context; import android.graphics.Bitmap; import

android.graphics.BitmapFactory; import android.graphics.Color; import

android.graphics.drawable.Drawable; import android.os.Parcel; import

android.util.Log; import android.view.LayoutInflater; import

android.view.View; import android.widget.LinearLayout;

import com.amap.api.maps.AMap; import

com.amap.api.maps.model.BitmapDescriptor; import

com.amap.api.maps.model.BitmapDescriptorFactory; import

com.amap.api.maps.model.LatLng; import

com.amap.api.maps.model.LatLngBounds; import

com.amap.api.maps.model.Marker; import

com.amap.api.maps.model.MarkerOptions; import

com.amap.api.maps.model.PolylineOptions; import

com.amap.api.services.core.LatLonPoint; import

com.amap.api.services.route.DrivePath; import

com.amap.api.services.route.DriveStep; import

com.amap.api.services.route.TMC; import com.free_ride.yiwei.R; import

com.free_ride.yiwei.mvputils.HttpUtils; import

com.free_ride.yiwei.personal.AppManager; import

com.free_ride.yiwei.pinchexin.MapActivity; import

com.free_ride.yiwei.utils.InternetAddressUtis; import

com.free_ride.yiwei.views.RoundImageView; import

com.squareup.picasso.Picasso;

import org.xutils.common.Callback; import org.xutils.x;

/*导航路线图层类。 */

public class DrivingRouteOverlay extends RouteOverlay{

private DrivePath drivePath;

private List throughPointList;

private List throughPointMarkerList = new ArrayList();

private boolean throughPointMarkerVisible = true;

private List tmcs;

private PolylineOptions mPolylineOptions;

private PolylineOptions mPolylineOptionscolor;

private Context mContext;

private boolean isColorfulline = true;

private float mWidth = 25;

private List mLatLngsOfPath;

private ArrayListiconList = new ArrayList();

public void setIsColorfulline(boolean iscolorfulline) {

this.isColorfulline = iscolorfulline; }

/**

* 根据给定的参数,构造一个导航路线图层类对象。

*

* @param amap 地图对象。

* @param path 导航路线规划方案。

* @param context 当前的activity对象。

*/

public DrivingRouteOverlay(Context context, AMap amap, DrivePath path,

LatLonPoint start, LatLonPoint end, List throughPointList) {

super(context);

mContext = context;

mAMap = amap;

this.drivePath = path;

startPoint = toLatLon(start);

endPoint = toLatLon(end);

this.throughPointList = throughPointList;

}

public float getRouteWidth() {

return mWidth;

}

/**

* 设置路线宽度

*

* @param mWidth 路线宽度,取值范围:大于0

*/

public void setRouteWidth(float mWidth) {

this.mWidth = mWidth;

}

/**

* 添加驾车路线添加到地图上显示。

*/  public void addToMap() {        initPolylineOptions();

try {

if (mAMap == null) {

return;

}

if (mWidth == 0 || drivePath == null) {

return;

}

mLatLngsOfPath = new ArrayList();

tmcs = new ArrayList();

List drivePaths = drivePath.getSteps();

mPolylineOptions.add(startPoint);

for (DriveStep step : drivePaths) {

List latlonPoints = step.getPolyline();

List tmclist = step.getTMCs();

tmcs.addAll(tmclist);

addDrivingStationMarkers(step, convertToLatLng(latlonPoints.get(0)));

for (LatLonPoint latlonpoint : latlonPoints) {

mPolylineOptions.add(convertToLatLng(latlonpoint));

mLatLngsOfPath.add(convertToLatLng(latlonpoint));

}

}

mPolylineOptions.add(endPoint);

if (startMarker != null) {

startMarker.remove();

startMarker = null;

}

if (endMarker != null) {

endMarker.remove();

endMarker = null;

}

addStartAndEndMarker();

addThroughPointMarker();

if (isColorfulline && tmcs.size()>0 ) {

colorWayUpdate(tmcs);

showcolorPolyline();            }else {

showPolyline();            }

} catch (Throwable e) {

e.printStackTrace();

}

}

/**

* 初始化线段属性

*/

private void initPolylineOptions() {

mPolylineOptions = null;

mPolylineOptions = new PolylineOptions();

mPolylineOptions.color(getDriveColor()).width(getRouteWidth());

}

private void showPolyline() {

addPolyLine(mPolylineOptions);

}

private void showcolorPolyline() {

addPolyLine(mPolylineOptionscolor);

}

/**

* 根据不同的路段拥堵情况展示不同的颜色

*

* @param tmcSection

*/

private void colorWayUpdate(List tmcSection) {

if (mAMap == null) {

return;

}

if (tmcSection == null || tmcSection.size() <= 0) {

return;

}

TMC segmentTrafficStatus;

mPolylineOptionscolor = null;

mPolylineOptionscolor = new PolylineOptions();

mPolylineOptionscolor.width(getRouteWidth());

List colorList = new ArrayList();

mPolylineOptionscolor.add(startPoint);

mPolylineOptionscolor.add(toLatLon(tmcSection.get(0).getPolyline().get(0)));

colorList.add(getDriveColor());

for (int i = 0; i < tmcSection.size(); i++) {

segmentTrafficStatus = tmcSection.get(i);

int color = getcolor(segmentTrafficStatus.getStatus());

List mployline = segmentTrafficStatus.getPolyline();

mployline.size(); j++) {

mPolylineOptionscolor.add(toLatLon(mployline.get(j)));

colorList.add(color); } }

mPolylineOptionscolor.add(endPoint);

colorList.add(getDriveColor());

mPolylineOptionscolor.colorValues(colorList);

}

private int getcolor(String status) {

if (status.equals("畅通")) {

return Color.GREEN;        } else if (status.equals("缓行")) {

return Color.YELLOW;      } else if (status.equals("拥堵")) {          return Color.RED;      } else if (status.equals("严重拥堵")) {            return Color.parseColor(“#990033”); } else { return

Color.parseColor(“#537edc”); } }

public LatLng convertToLatLng(LatLonPoint point) {

return new LatLng(point.getLatitude(),point.getLongitude()); }

/**

* @param driveStep

* @param latLng

*/

private void addDrivingStationMarkers(DriveStep driveStep, LatLng latLng) {

addStationMarker(new MarkerOptions()

.position(latLng)

.title("\u65B9\u5411:" + driveStep.getAction()

+ "\n\u9053\u8DEF:" + driveStep.getRoad())

.snippet(driveStep.getInstruction()).visible(nodeIconVisible)

.anchor(0.5f, 0.5f).icon(getDriveBitmapDescriptor()));

}

@Override

protected LatLngBounds getLatLngBounds() {

LatLngBounds.Builder b = LatLngBounds.builder();

b.include(new LatLng(startPoint.latitude, startPoint.longitude));

b.include(new LatLng(endPoint.latitude, endPoint.longitude));

if (this.throughPointList != null && this.throughPointList.size() > 0) {

for (int i = 0; i < this.throughPointList.size(); i++) {

b.include(new LatLng(

this.throughPointList.get(i).getLatitude(),

this.throughPointList.get(i).getLongitude()));

}

}

return b.build();

}

public void setThroughPointIconVisibility(boolean visible) {

try {

throughPointMarkerVisible = visible;

if (this.throughPointMarkerList != null

&& this.throughPointMarkerList.size() > 0) {

for (int i = 0; i < this.throughPointMarkerList.size(); i++) {

this.throughPointMarkerList.get(i).setVisible(visible);

}

}

} catch (Throwable e) {

e.printStackTrace();

}

}

// 添加marker

private void addThroughPointMarker() {

if (this.throughPointList != null && this.throughPointList.size() > 0) {

LatLonPoint latLonPoint = null;

iconList.add(BitmapDescriptorFactory.fromResource(R.mipmap.map_end_img));

for (int i = 0; i < this.throughPointList.size(); i++) {

latLonPoint = this.throughPointList.get(i);

if (latLonPoint != null) {

throughPointMarkerList.add(mAMap.addMarker(initMarkerObject(latLonPoint,i)));

}

}

}

}

// 初始化marker  自定义marker 样式 下main会给出map_custom_marker_img  xml 文件

private MarkerOptions initMarkerObject(LatLonPoint latLonPoint, int i) {

View inflate = LayoutInflater.from(AppManager.getAppManager().currentActivity()).inflate(R.layout.map_custom_marker_img,null);

RoundImageView roundImg = (RoundImageView) inflate.findViewById(R.id.map_custom_marker);

roundImg.setImageBitmap(BitmapFactory.decodeResource(AppManager.getAppManager().currentActivity().getResources(),R.mipmap.map_passheand_one));

MarkerOptions options = null;

if (i%2==0){

options = new MarkerOptions();

options.position(new LatLng(latLonPoint.getLatitude(),latLonPoint.getLongitude()))

.visible(throughPointMarkerVisible)

.icon(BitmapDescriptorFactory.fromBitmap(convertViewToBitmap(inflate)))

.autoOverturnInfoWindow(true)

.title("距离"+(i+1)+"还有"+(calculateDistance(this.startPoint,newLatLng(throughPointList.get(i).getLatitude(),throughPointList.get(i).getLongitude())))+”米”);

}else { options = new MarkerOptions();

options.position(new LatLng(latLonPoint.getLatitude(),latLonPoint.getLongitude()))

.visible(throughPointMarkerVisible)

.icon(BitmapDescriptorFactory.fromBitmap(convertViewToBitmap(inflate)))

.autoOverturnInfoWindow(true)

.title("距离"+(i+1)+"还有"+(calculateDistance(this.startPoint,newLatLng(throughPointList.get(i).getLatitude(),throughPointList.get(i).getLongitude())))+”米”);

} return options;

}

/**

* view 转为 bitmap 对象

* @param view

* @return

*/

public static Bitmap convertViewToBitmap(View view) {

view.destroyDrawingCache();

view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),

View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));

view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());

view.setDrawingCacheEnabled(true);

return view.getDrawingCache(true);

}

private BitmapDescriptor getThroughPointBitDes() {

return BitmapDescriptorFactory.fromResource(R.mipmap.pass_head);

}

/**

* 获取两点间距离

*

* @param start

* @param end

* @return

*/

public static int calculateDistance(LatLng start, LatLng end) {

double x1 = start.longitude;

double y1 = start.latitude;

double x2 = end.longitude;

double y2 = end.latitude;

return calculateDistance(x1, y1, x2, y2);

}

public static int calculateDistance(double x1, double y1, double x2, double y2) {

final double NF_pi = 0.01745329251994329; // 弧度 PI/180

x1 *= NF_pi;

y1 *= NF_pi;

x2 *= NF_pi;

y2 *= NF_pi;

double sinx1 = Math.sin(x1);

double siny1 = Math.sin(y1);

double cosx1 = Math.cos(x1);

double cosy1 = Math.cos(y1);

double sinx2 = Math.sin(x2);

double siny2 = Math.sin(y2);

double cosx2 = Math.cos(x2);

double cosy2 = Math.cos(y2);

double[] v1 = new double[3];

v1[0] = cosy1 * cosx1 - cosy2 * cosx2;

v1[1] = cosy1 * sinx1 - cosy2 * sinx2;

v1[2] = siny1 - siny2;

double dist = Math.sqrt(v1[0] * v1[0] + v1[1] * v1[1] + v1[2] * v1[2]);

return (int) (Math.asin(dist / 2) * 12742001.5798544);

}

//获取指定两点之间固定距离点

public static LatLng getPointForDis(LatLng sPt, LatLng ePt, double dis) {

double lSegLength = calculateDistance(sPt, ePt);

double preResult = dis / lSegLength;

return new LatLng((ePt.latitude - sPt.latitude) * preResult + sPt.latitude, (ePt.longitude - sPt.longitude) * preResult +sPt.longitude);

}

/**

* 去掉DriveLineOverlay上的线段和标记。

*/

@Override

public void removeFromMap() {

try {

super.removeFromMap();

if (this.throughPointMarkerList != null

&& this.throughPointMarkerList.size() > 0) {

for (int i = 0; i < this.throughPointMarkerList.size(); i++) {

this.throughPointMarkerList.get(i).remove();

}

this.throughPointMarkerList.clear();

}

} catch (Throwable e) {

e.printStackTrace();

}

}

/**

* 把LatLonPoint对象转化为LatLon对象

*/

public static LatLng toLatLon(LatLonPoint lonPoint){

return new LatLng(lonPoint.getLatitude(),lonPoint.getLongitude());

} }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值