2017-01-10 13 views
3

Googleマップにトラフィックデータを表示するカスタムタイルプロバイダを開発中です。高いズームレベルでは、それは私のために良いです。 good oneしかし、ポリラインは低レベルのズームでオーバーラップしています。 overlappigGoogle Maps v2カスタムタイルプロバイダ

マイカスタムタイルプロバイダクラスは

public class PolylineTileProvider implements TileProvider { 
private static final String TAG = "TileOverlay"; 
private final int mTileSize = 256; 
private final SphericalMercatorProjection mProjection = new SphericalMercatorProjection(mTileSize); 
private final int mScale = 2; 
private final int mDimension = mScale * mTileSize; 
private final List<PolylineOptions> polylines; 

public PolylineTileProvider(List<PolylineOptions> polylines) { 
    this.polylines = polylines; 
} 

@Override 
public Tile getTile(int x, int y, int zoom) { 
    Matrix matrix = new Matrix(); 
    float scale = ((float) Math.pow(2, zoom) * mScale); 
    matrix.postScale(scale, scale); 
    matrix.postTranslate(-x * mDimension, -y * mDimension); 
    Bitmap bitmap = Bitmap.createBitmap(mDimension, mDimension, Bitmap.Config.ARGB_8888); //save memory on old phones 
    Canvas c = new Canvas(bitmap); 
    c.setMatrix(matrix); 
    drawCanvasFromArray(c, scale); 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); 
    return new Tile(mDimension, mDimension, baos.toByteArray()); 
} 

private void drawCanvasFromArray(Canvas c, float scale) { 

    Paint paint = new Paint(); 
    paint.setAntiAlias(true); 
    paint.setStyle(Paint.Style.STROKE); 
    paint.setStrokeCap(Paint.Cap.ROUND); 
    paint.setStrokeJoin(Paint.Join.ROUND); 
    paint.setShadowLayer(0, 0, 0, 0); 
    paint.setAntiAlias(true); 

    if (polylines != null) { 
     for (int i = 0; i < polylines.size(); i++) { 
      List<LatLng> route = polylines.get(i).getPoints(); 
      paint.setColor(polylines.get(i).getColor()); 
      paint.setStrokeWidth(getLineWidth(polylines.get(i).getWidth(), scale)); 
      Path path = new Path(); 
      if (route != null && route.size() > 1) { 
       Point screenPt1 = mProjection.toPoint(route.get(0)); //first point 
       MarkerOptions m = new MarkerOptions(); 
       m.position(route.get(0)); 
       path.moveTo((float) screenPt1.x, (float) screenPt1.y); 
       for (int j = 1; j < route.size(); j++) { 
        Point screenPt2 = mProjection.toPoint(route.get(j)); 
        path.lineTo((float) screenPt2.x, (float) screenPt2.y); 
       } 
      } 
      c.drawPath(path, paint); 
     } 
    } 
} 

private float getLineWidth(float width, float scale) { 
    return width/(scale); 
} 
} 

Traficで層があまり良くGoogleマップのAndroidアプリに表示されています。

私はどのように似たような層を作ることができますか?前もって感謝します。

答えて

0

あなたが提供したマトリックスを使用して拡大縮小された1つの画像を作成するので、画像がぼやけて見えない理由があります。

代わりに、Matrixを使用して適切なサイズの画像を生成しません。

Todoので、キャンバスでsetMatrix呼び出しを取り除きます。 と 正しい縮尺の座標を持つパスにポイントを追加してください。

x = screenPt1.x * scale - x * mDimension; 
y = screenPt1.y * scale - y * mDimension; 

ズームレベルごとに、指定したとおりの正確な行が得られます。

関連する問題