private LatLng getPointForDis(LatLng sPt, LatLng ePt, double dis) { double lSegLength = AMapUtils.calculateLineDistance(sPt, ePt); double preResult = dis / lSegLength; return new LatLng( (ePt.latitude - sPt.latitude) * preResult + sPt.latitude, (ePt.longitude - sPt.longitude) * preResult + sPt.longitude); }
// 高德地图提供计算两点的距离 返回km public static float CalculateDistance( double start_lat, double start_lng, double end_lat, double end_lng) { LatLng start = new LatLng(start_lat, start_lng); LatLng end = new LatLng(end_lat, end_lng); float dis = AMapUtils.calculateLineDistance(start, end); dis = dis / 1000; return dis; }
/** 计算距离 */ public void calculateDistance(Double lati, Double logti) { LatLng startpos = new LatLng(mTown.getGeoinfo().getLatitude(), mTown.getGeoinfo().getLongitude()); LatLng endpos = new LatLng(lati, logti); float distan = AMapUtils.calculateLineDistance(startpos, endpos); if (distan < DISTANCE) { LogUtil.v("MessboardActivity info: ", "distance is in 50!"); this.mEditView.setVisibility(View.VISIBLE); this.mTophint.setText(getString(R.string.messboard_canmess)); // stop location this.stopLocation(); } else { LogUtil.v("MessboardActivity info: ", "distance is out of 50!"); this.mTophint.setText(getString(R.string.messboard_showdistan, (int) distan)); } }
/* * 返回 km * */ public static double getDistance(double lat1, double lng1, double lat2, double lng2) { LatLng start = new LatLng(lat1, lng1); LatLng end = new LatLng(lat2, lng2); double radLat1 = rad(lat1); double radLat2 = rad(lat2); double a = radLat1 - radLat2; double b = rad(lng1) - rad(lng2); double s = 2 * Math.asin( Math.sqrt( Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2))); s = s * EARTH_RADIUS; s = Math.round(s * 10000) / 10000.0; float result[] = new float[1]; Location.distanceBetween(lat1, lng1, lat2, lng2, result); s = Math.round(((double) result[0] / 1000) * 100) / 100.0; AMapUtils.calculateLineDistance(start, end); return s; }
private void colorWayUpdate(List<TMC> tmcSection) { if (mAMap == null) { return; } if (mLatLngsOfPath == null || mLatLngsOfPath.size() <= 0) { return; } if (tmcSection == null || tmcSection.size() <= 0) { return; } int j = 0; LatLng startLatLng = mLatLngsOfPath.get(0); LatLng endLatLng = null; double segmentTotalDistance = 0; TMC segmentTrafficStatus; List<LatLng> tempList = new ArrayList<LatLng>(); // 画出起点到规划路径之间的连线 addPolyLine(new PolylineOptions().add(startPoint, startLatLng).setDottedLine(true)); // 终点和规划路径之间连线 addPolyLine( new PolylineOptions() .add(mLatLngsOfPath.get(mLatLngsOfPath.size() - 1), endPoint) .setDottedLine(true)); for (int i = 0; i < mLatLngsOfPath.size() && j < tmcSection.size(); i++) { segmentTrafficStatus = tmcSection.get(j); endLatLng = mLatLngsOfPath.get(i); double distanceBetweenTwoPosition = AMapUtils.calculateLineDistance(startLatLng, endLatLng); segmentTotalDistance = segmentTotalDistance + distanceBetweenTwoPosition; if (segmentTotalDistance > segmentTrafficStatus.getDistance() + 1) { double toSegDis = distanceBetweenTwoPosition - (segmentTotalDistance - segmentTrafficStatus.getDistance()); LatLng middleLatLng = getPointForDis(startLatLng, endLatLng, toSegDis); tempList.add(middleLatLng); startLatLng = middleLatLng; i--; } else { tempList.add(endLatLng); startLatLng = endLatLng; } if (segmentTotalDistance >= segmentTrafficStatus.getDistance() || i == mLatLngsOfPath.size() - 1) { if (j == tmcSection.size() - 1 && i < mLatLngsOfPath.size() - 1) { for (i++; i < mLatLngsOfPath.size(); i++) { LatLng lastLatLng = mLatLngsOfPath.get(i); tempList.add(lastLatLng); } } j++; if (segmentTrafficStatus.getStatus().equals("畅通")) { addPolyLine((new PolylineOptions()).addAll(tempList).width(mWidth).color(Color.GREEN)); } else if (segmentTrafficStatus.getStatus().equals("缓行")) { addPolyLine((new PolylineOptions()).addAll(tempList).width(mWidth).color(Color.YELLOW)); } else if (segmentTrafficStatus.getStatus().equals("拥堵")) { addPolyLine((new PolylineOptions()).addAll(tempList).width(mWidth).color(Color.RED)); } else if (segmentTrafficStatus.getStatus().equals("严重拥堵")) { addPolyLine( (new PolylineOptions()) .addAll(tempList) .width(mWidth) .color(Color.parseColor("#990033"))); } else { addPolyLine( (new PolylineOptions()) .addAll(tempList) .width(mWidth) .color(Color.parseColor("#537edc"))); } tempList.clear(); tempList.add(startLatLng); segmentTotalDistance = 0; } if (i == mLatLngsOfPath.size() - 1) { addPolyLine(new PolylineOptions().add(endLatLng, endPoint).setDottedLine(true)); } } }