Android сохраняет полигон с карты как растровый одинаковый размер для всех устройств - PullRequest
0 голосов
/ 06 января 2019

Я рисую многоугольник на карте Google, и он отлично работает. Что мне нужно, это сохранить этот полигон как растровое изображение для фиксированного масштаба. Я использую этот код для этого.

private static List<Point> scalePolygonPoints(List<LatLng> points, float scale, Projection projection) {
    List<Point> scaledPoints = new ArrayList(points.size());

    LatLng polygonCenter = getPolygonCenterPoint(points);
    Point centerPoint = projection.toScreenLocation(polygonCenter);

    for (int i=0; i < points.size(); i++) {
        Point screenPosition = projection.toScreenLocation(points.get(i));
        screenPosition.x = (int) (scale * (screenPosition.x - centerPoint.x) + centerPoint.x);
        screenPosition.y = (int) (scale * (screenPosition.y - centerPoint.y) + centerPoint.y);
        scaledPoints.add(screenPosition);
    }

    return scaledPoints;
}

private static LatLng getPolygonCenterPoint(List<LatLng> polygonPointsList){
    LatLng centerLatLng = null;
    LatLngBounds.Builder builder = new LatLngBounds.Builder();
    for(int i = 0; i < polygonPointsList.size() ; i++) {
        builder.include(polygonPointsList.get(i));
    }
    LatLngBounds bounds = builder.build();
    centerLatLng =  bounds.getCenter();
    return centerLatLng;
}

А затем создать растровое изображение

private Bitmap createPolylineBitmap(List<Point> scaledPoints) {
            Bitmap bitmap = Bitmap.createBitmap(800, 600, Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(bitmap);

            Paint paint = new Paint();
            paint.setColor(ContextCompat.getColor(this, R.color.black));
            paint.setStrokeWidth(10);
            paint.setDither(true);
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeJoin(Paint.Join.ROUND);
            paint.setStrokeCap(Paint.Cap.ROUND);
            paint.setAntiAlias(true);


            for (int i = 0; i < scaledPoints.size(); i++) {
                try {
                    canvas.drawLine(scaledPoints.get(i).x, scaledPoints.get(i).y, scaledPoints.get(i + 1).x, scaledPoints.get(i + 1).y, paint);
                }
                catch(Exception ex){
                    canvas.drawLine(scaledPoints.get(i).x, scaledPoints.get(i).y, scaledPoints.get(0).x, scaledPoints.get(0).y, paint);
                }
            }
            return bitmap;
        }

Проблема заключается в том, что этот метод использует проекцию экрана, и когда пользователь изменяет масштаб или перетаскивает карту, он меняет положение многоугольника на растровом изображении или даже на его четкие границы. Как сделать так, чтобы рисовать многоугольник одинакового размера на всех устройствах, независимо от масштаба или положения камеры?

EDIT: Таким образом, в основном мне удалось получить правильный размер карты масштабирования полигонов в правильном положении перед сохранением ее в растровое изображение. Но проблема в том, что когда я использую устройство с разным разрешением, размер полигона также меняется. Как это предотвратить?

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Сохраните изображение SVG вашего многоугольника. SVG - это вектор, растровое изображение - не

0 голосов
/ 10 января 2019

Умный взлом, который может сработать для вас - почему бы не вручную масштабировать камеру, чтобы она соответствовала полилинии, когда пользователь пытается сохранить геозону.

 val latLngs = getLatLngs()
 val builder = LatLngBounds.Builder()
 latLngs.forEach {
        builder.include(it.position)
 }
 val padding = 200
 val bounds = builder.build()
 val cameraUpdate = CameraUpdateFactory.newLatLngBounds(bounds, padding)
 map.moveCamera(cameraUpdate)
 //Do your projection operation here...
...