微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android – Google Maps v2 Custom Tile Provider

我正在开发一个自定义磁贴提供商,以在Google地图上显示流量数据.在高缩放级别,它对我来说很好.

good one

但折线在低级别缩放时重叠.

overlappig

我的自定义磁贴提供程序类是

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,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);
    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 Maps android应用程序中显示得非常好.

我怎样才能制作一个类似的图层.提前致谢.

解决方法

它之所以模糊,或者可能在屏幕上看不到,是因为你创建了一个图像,然后使用你提供的矩阵进行缩放.

相反,你不应该使用矩阵并生成正确大小的图像.

Todo所以,删除你在Canvas上的setMatrix调用

使用正确的缩放坐标将点添加到路径.

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

然后在每个缩放级别获得指定的确切行.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐