在Google地图中绘制ARC折线

我如何在Google Map中绘制弧折线

我已经使用这个代码来创build弯曲的折线。

这里是绘制弯曲的折线的方法

private void showCurvedPolyline (LatLng p1, LatLng p2, double k) { //Calculate distance and heading between two points double d = SphericalUtil.computeDistanceBetween(p1,p2); double h = SphericalUtil.computeHeading(p1, p2); //Midpoint position LatLng p = SphericalUtil.computeOffset(p1, d*0.5, h); //Apply some mathematics to calculate position of the circle center double x = (1-k*k)*d*0.5/(2*k); double r = (1+k*k)*d*0.5/(2*k); LatLng c = SphericalUtil.computeOffset(p, x, h + 90.0); //Polyline options PolylineOptions options = new PolylineOptions(); List<PatternItem> pattern = Arrays.<PatternItem>asList(new Dash(30), new Gap(20)); //Calculate heading between circle center and two points double h1 = SphericalUtil.computeHeading(c, p1); double h2 = SphericalUtil.computeHeading(c, p2); //Calculate positions of points on circle border and add them to polyline options int numpoints = 100; double step = (h2 -h1) / numpoints; for (int i=0; i < numpoints; i++) { LatLng pi = SphericalUtil.computeOffset(c, r, h1 + i * step); options.add(pi); } //Draw polyline mMap.addPolyline(options.width(10).color(Color.MAGENTA).geodesic(false).pattern(pattern)); } 

OUTPUT

1.如果我使用this.showCurvedPolyline(latLng1,latLng2,0.1); 然后得到:

在这里输入图像说明

正如你在上面的图片中看到的,我们非常接近我们的目标,但是不知道为什么它没有连接到另一个终点

2.如果我使用this.showCurvedPolyline(latLng1,latLng2,1); 然后得到:

在这里输入图像说明

3.如果我使用LatLng c = SphericalUtil.computeOffset(p,x,h – 90.0); 然后得到:

在这里输入图像说明

注意:我不想要这么大的圈子形状我真的不想要那么高的高度

这是我想要一个弧形如下图所示

在这里输入图像说明

这里是我用来在两个geo-locatios之间添加弯曲折线 geo-locatios

 private void addCurvedPolyLine() { LatLng latLng1 = new LatLng(40.7128, 74.0059); // New York LatLng latLng2 = new LatLng(51.5074, 0.1278); // London Marker marker1 = mMap.addMarker(new MarkerOptions().position(latLng1).title("Start")); Marker marker2 = mMap.addMarker(new MarkerOptions().position(latLng2).title("End")); LatLngBounds.Builder builder = new LatLngBounds.Builder(); builder.include(marker1.getPosition()); builder.include(marker2.getPosition()); LatLngBounds bounds = builder.build(); int padding = 0; // offset from edges of the map in pixels CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding); mMap.moveCamera(cu); mMap.animateCamera(cu); this.showCurvedPolyline(latLng1, latLng2, 0.1); } 

Solutions Collecting From Web of "在Google地图中绘制ARC折线"

我在另一个问题中提出的解决scheme主要集中在弯曲的多段线上。 例如,当您有一条路线API路线,其起点和终点与路面alignment时,原始请求中的实际起点和终点就是build筑物的位置,因此您可以使用此曲线虚线折线连接道路和build筑物。

如果在你的例子中有很大的距离,我相信你可以使用API​​中可用的测地线。 您可以将折线选项的geodesic属性设置为true。

 public void onMapReady(GoogleMap googleMap) { mMap = googleMap; mMap.getUiSettings().setZoomControlsEnabled(true); LatLng latLng1 = new LatLng(40.7128, 74.0059); // New York LatLng latLng2 = new LatLng(51.5074, 0.1278); // London Marker marker1 = mMap.addMarker(new MarkerOptions().position(latLng1).title("Start")); Marker marker2 = mMap.addMarker(new MarkerOptions().position(latLng2).title("End")); List<PatternItem> pattern = Arrays.<PatternItem>asList(new Dash(30), new Gap(20)); PolylineOptions popt = new PolylineOptions().add(latLng1).add(latLng2) .width(10).color(Color.MAGENTA).pattern(pattern) .geodesic(true); mMap.addPolyline(popt); LatLngBounds.Builder builder = new LatLngBounds.Builder(); builder.include(marker1.getPosition()); builder.include(marker2.getPosition()); LatLngBounds bounds = builder.build(); int padding = 150; // offset from edges of the map in pixels CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding); mMap.moveCamera(cu); mMap.animateCamera(cu); } 

结果折线显示在我的屏幕截图中

在这里输入图像说明

我希望这有帮助!

这是我使用@xomena改进后的Route对象

Route.java

我的更改:

  • 使用heading - 90.0而不是heading + 90.0
  • 重命名variables,使常量(仍然搞清楚代码的一部分正在做什么…)
  • 用我的新逻辑重写

基本上,如果原点和目标的距离小于1000km,我只绘制一条曲线路线。 对于更远的距离,正如我在这里所提到的,我发现循环内部分h1 + i * step由于每个迭代器中的double calculation error而造成一个小错误,并使最终path不能正确放置。

我的安全select是画乌鸦飞行路线,但我的build议是不使用K = 1,这不是性能效率。 我写了另一种方法,只是将原点和目标点添加到路由,跳过所有其他复杂的计算。

以后我会试着回到这个长曲线的问题,现在这个解决scheme还是适合我的问题。

Hy,你需要用这个方法改变你的showCurvePolyline方法。

  private void showCurvedPolyline (LatLng p1, LatLng p2, double k) { //Calculate distance and heading between two points double d = 0; if (d == 0) d= SphericalUtil.computeDistanceBetween(origin, dest); double h = SphericalUtil.computeHeading(p1, p2); // Calculate midpoint position LatLng midPoint = SphericalUtil.computeOffset(p1, d / 2, h); //Apply some mathematics to calculate position of the circle center double x = (1-k*k)*d*0.5/(2*k); double r = (1+k*k)*d*0.5/(2*k); LatLng c = SphericalUtil.computeOffset(p, x, h + 90.0); //Polyline options PolylineOptions options = new PolylineOptions(); List<PatternItem> pattern = Arrays.<PatternItem>asList(new Dash(30), new Gap(20)); //Calculate heading between circle center and two points double h1 = SphericalUtil.computeHeading(c, p1); double h2 = SphericalUtil.computeHeading(c, p2); // Calculate position of the curve center point double sqrCurvature = DEFAULT_CURVE_ROUTE_CURVATURE * DEFAULT_CURVE_ROUTE_CURVATURE; double extraParam = distance / (4 * DEFAULT_CURVE_ROUTE_CURVATURE); double midPerpendicularLength = (1 - sqrCurvature) * extraParam; double r = (1 + sqrCurvature) * extraParam; LatLng midCurvePoint = SphericalUtil.computeOffset(midPoint, midPerpendicularLength, heading - 90.0); // Calculate heading between circle center and two points double headingToOrigin = SphericalUtil.computeHeading(midCurvePoint, origin); double headingToDest = SphericalUtil.computeHeading(midCurvePoint, dest); // Calculate positions of points on the curve double step = (headingToDest - headingToOrigin) / DEFAULT_CURVE_POINTS; List<LatLng> points = new ArrayList<>(); for (int i = 0; i < DEFAULT_CURVE_POINTS; ++i) { points.add(SphericalUtil.computeOffset(midCurvePoint, r, headingToOrigin + i * step)); } for (int i=0; i <points; i++) { LatLng pi = SphericalUtil.computeOffset(c, r, h1 + i * step); options.add(pi); } //Draw polyline mMap.addPolyline(options.width(10).color(Color.MAGENTA).geodesic(false).pattern(pattern)); } 

那么你可以绘制arcPolyLine.It在前面的答案提供的文件中提供。