2012-03-26 27 views
2

ポリゴンの線やエッジを滑らかにすることはできますか?それは現在非常にシャープで角度があり、それらの角度が実際に曲率を持っていれば素晴らしいでしょう。何か案は?Google Maps API V3 - ポリゴンスムージドエッジ

+1

に触発されたAndroid上で私のために働いたBスプラインに基づいて平滑化アルゴリズムでもそう、あなたがそれを行うための良い方法を見つけた場合は私に知らせてください。私はあなたが表示することができますポイントの新しいセット(最も可能性が高いオリジナル)を生成する曲線平滑化/フィッティングアルゴリズムにポイントの配列(マッピングされたポリゴンの頂点)を渡す必要があると仮定します地図。 – Fraggle

答えて

0

ポリゴンにポイントを追加します。プロットされるポイントが多いほど、カーブはより緩やかになります。ここで

+0

しかし、追加した各ポイントを新しい場所に手動でドラッグする必要があります。いくつかのアルゴリズムを使う方がいいです(Maps APIに組み込まれていればうれしいでしょう)。 – Fraggle

0

が、私はこれを必要としていhttps://johan.karlsteen.com/2011/07/30/improving-google-maps-polygons-with-b-splines/

public List<LatLng> bspline(List<LatLng> poly) { 

     if (poly.get(0).latitude != poly.get(poly.size()-1).latitude || poly.get(0).longitude != poly.get(poly.size()-1).longitude){ 
      poly.add(new LatLng(poly.get(0).latitude,poly.get(0).longitude)); 
     } 
     else{ 
      poly.remove(poly.size()-1); 
     } 
     poly.add(0,new LatLng(poly.get(poly.size()-1).latitude,poly.get(poly.size()-1).longitude)); 
     poly.add(new LatLng(poly.get(1).latitude,poly.get(1).longitude)); 

     Double[] lats = new Double[poly.size()]; 
     Double[] lons = new Double[poly.size()]; 

     for (int i=0;i<poly.size();i++){ 
      lats[i] = poly.get(i).latitude; 
      lons[i] = poly.get(i).longitude; 
     } 

     double ax, ay, bx, by, cx, cy, dx, dy, lat, lon; 
     float t; 
     int i; 
     List<LatLng> points = new ArrayList<>(); 
     // For every point 
     for (i = 2; i < lats.length - 2; i++) { 
      for (t = 0; t < 1; t += 0.2) { 
       ax = (-lats[i - 2] + 3 * lats[i - 1] - 3 * lats[i] + lats[i + 1])/6; 
       ay = (-lons[i - 2] + 3 * lons[i - 1] - 3 * lons[i] + lons[i + 1])/6; 
       bx = (lats[i - 2] - 2 * lats[i - 1] + lats[i])/2; 
       by = (lons[i - 2] - 2 * lons[i - 1] + lons[i])/2; 
       cx = (-lats[i - 2] + lats[i])/2; 
       cy = (-lons[i - 2] + lons[i])/2; 
       dx = (lats[i - 2] + 4 * lats[i - 1] + lats[i])/6; 
       dy = (lons[i - 2] + 4 * lons[i - 1] + lons[i])/6; 
       lat = ax * Math.pow(t + 0.1, 3) + bx * Math.pow(t + 0.1, 2) + cx * (t + 0.1) + dx; 
       lon = ay * Math.pow(t + 0.1, 3) + by * Math.pow(t + 0.1, 2) + cy * (t + 0.1) + dy; 
       points.add(new LatLng(lat, lon)); 
      } 
     } 
     return points; 

    }