2017-04-09 47 views
2

湾曲破線は次のようになり持ってブラウザから: enter image description hereGoogle Maps Androidで曲線の破線を描くことはできますか? Googleマップで

しかし、私は自分のAndroidのプロジェクトでGoogleマップを実装する場合、それは

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/how-to-draw-dashed-polyline-with-android-google-map-sdk-v2)をご覧ください。 – KENdi

+0

@KENdi Google Maps Android APIで直線的に破線のポリラインを実装できますが、曲線の点線はJavascript APIにのみ表示されます。私はiOS上のGoogleマップアプリケーションをチェックしている、Androidは、曲線がない、私はこれは不可能だ(または描画するのが難しいと思う) –

答えて

9

2点間に曲線の破線のポリラインを実装できます。この目的のために、SphericalUtilクラスを持つGoogle Maps Android API Utility Libraryを使用して、コードに数式を適用してポリラインを作成することができます。

あなたは

compile 'com.google.maps.android:android-maps-utils:0.5'としてあなたのGradleでユーティリティライブラリを含める必要があります。

私のサンプルを見てくださいアクティビティと関数showCurvedPolyline (LatLng p1, LatLng p2, double k)は、2点間の破線の曲線ポリラインを構築します。最後のパラメータ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)); 
} 

} 

を使用し、あなただけのapp/src/debug/res/values/google_maps_api.xml

enter image description hereにあなたと私のAPIキーを置き換えるGitHubの

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

からの完全なコードとサンプルプロジェクトをダウンロードすることができます

+0

多くのありがとう、それは私の問題を解決した。私は、この問題のための私の仕事が別のものを開始するために長い時間がかかり始めた後に再び始まったので、後半にはコメントをお詫び申し上げます。 –

1

上記の解決方法のおかげで@xomena。ほとんどの場合、美しく動作します。

  • k == 1、xは0であろうと中点(P)中間カーブポイント(C)と同じになりますが、いくつかの改善が必要です。つまり、直線でなければならないが、ステップを計算するときにはゼロではないので、最終結果は上記の条件であいまいな半円曲線になります。

  • 曲線が十分な長さ、LIMIT = 1000kmを言わせて、ループ内h1 + i * step内の各計算は、(私は推測によるJavaのdouble計算誤差に)正しい値に小さな誤差を作ります。その後、ポリラインの開始点と終了点は、開始座標と終了座標に正確に一致しません。さらに、ポリラインの曲率は、私の研究に基づいて予測できません。その理由は、見出しの計算ベースが正しくないことがある地球の表面の曲率である可能性があります。

私のクイックフィックスは、直線にするためにstepif k == 1を0にリセットすることです。 2番目の問題については、2点間の距離がLIMIT 1000kmより大きい場合は、k = 1と直線を描くことが私にとって安全な選択になります。

+0

これを共有していただきありがとうございます。これを見てください:stackoverflow.com/questions/46411266/draw-arc-polyline-in-google-map showCurvedPolyline(..)メソッドのために最終的に書いた更新されたソリューションを持つことはできますか – Sonali

関連する問題