2017-04-09 163 views
2

在谷歌地图从浏览器,具有弯曲的虚线是这样的: enter image description here我可以在Google Maps Android中绘制弯曲的虚线吗?

但是,当我在自己的Android项目实现谷歌地图,它并没有显示这条线

enter image description here

如何绘制这条线?

+0

我认为这是可能的,我在这里找到一个[jsfiddle](http://jsfiddle.net/geocodezip/re6km2wp/3/)可以做到这一点。但问题是它使用[Google Maps JavaScript API](https://developers.google.com/maps/documentation/javascript/)来使其工作。有关更多信息,请尝试检查此[SO问题](http:// stackoverflow。com/questions/13721008 /如何绘制虚线 - 折线-with-android-google-map-sdk-v2)如果它可以帮助你。 – KENdi

+0

@KENdi非常感谢,Google Maps Android API中的直线虚折线可以实现,但曲线虚线只出现在Javascript API中。我在iOS,Android上检查过Google Maps应用程序,它没有任何曲线,我猜这是不可能的(或者太难绘制) –

回答

9

您可以在两点之间实现弯曲的虚线折线。为此,您可以使用具有SphericalUtil类的Google Maps Android API Utility Library,并在代码中应用一些数学运算来创建多段线。

您必须在您的gradle这个实用程序库作为

compile 'com.google.maps.android:android-maps-utils:0.5'

请看看我的示例活动和功能showCurvedPolyline (LatLng p1, LatLng p2, double k)它构造了两点之间的虚线弯曲多段线。最后一个参数k定义折线的曲率,它可以是> 0和< = 1。在我的例子中,我用K = 0.5

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback { 

private GoogleMap mMap; 
private LatLng sydney1; 
private LatLng sydney2; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_maps); 
    // Obtain the SupportMapFragment and get notified when the map is ready to be used. 
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
      .findFragmentById(R.id.map); 
    mapFragment.getMapAsync(this); 
} 

@Override 
public void onMapReady(GoogleMap googleMap) { 
    mMap = googleMap; 

    mMap.getUiSettings().setZoomControlsEnabled(true); 

    // Add a marker in Sydney and move the camera 
    sydney1 = new LatLng(-33.904438,151.249852); 
    sydney2 = new LatLng(-33.905823,151.252422); 

    mMap.addMarker(new MarkerOptions().position(sydney1) 
      .draggable(false).visible(true).title("Marker in Sydney 1")); 
    mMap.addMarker(new MarkerOptions().position(sydney2) 
      .draggable(false).visible(true).title("Marker in Sydney 2")); 

    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney1, 16F)); 

    this.showCurvedPolyline(sydney1,sydney2, 0.5); 
} 

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)); 
} 

} 

您可以从GitHub

下载示例项目,完整代码

https://github.com/xomena-so/so43305664

只是你代替我的API密钥在app/src/debug/res/values/google_maps_api.xml

enter image description here

+0

非常感谢,它解决了我的问题。我很抱歉发表评论,因为我在这个问题上的任务在很长一段时间之后又开始了,等待着再次开始。 –

1

感谢上述解决方案的@xomena。它在大多数情况下运行非常好。但需要一些改进:

  • k == 1,x是0和中点(P)将是相同的曲线中期(c)点。这意味着它应该是一条直线,但是当你计算该步时,它不是零,所以最终结果是一个半圆曲线,与上述条件不一致。

  • 当曲线足够长,让说LIMIT = 1000km,在h1 + i * step每个计算循环内做一个微小的错误到正确的值(由于java的double计算错误我猜)。然后,多段线的起点和终点与开始和结束坐标不完全匹配。此外,折线的曲率是不可预知的,基于我的研究,其原因可能是地球表面的曲率,这可能会使您的计算基于标题不正确。

我速战速决是重置,使之成为一条直线。对于第二个问题,如果两点之间的距离大于1000km的极限,则用k = 1画一条直线对我来说将是一个更安全的选择。

+0

感谢您分享此内容。请看看这个:stackoverflow.com/questions/46411266/draw-arc-polyline-in-google-map我可以有你最终为showCurvedPolyline(..)方法写的更新的解决方案 – Sonali