Масштабирование Google Map и созданной полилинии на Android - PullRequest
0 голосов
/ 02 декабря 2018

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

enter image description here

Затем я сохраняю изображение полилинии, например:

private Bitmap createPolylineBitmap() {
    Bitmap bitmap = Bitmap.createBitmap(((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getView().getWidth(), ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getView().getHeight(), Bitmap.Config.ARGB_8888);
    //Bitmap bitmap = Bitmap.createBitmap(((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getView().getWidth(), ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getView().getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);

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

    ArrayList<LatLng> coordinates = Mainigie.PievienotasKoordinates;

    for (int i = 0; i < coordinates.size(); i++) {
        try {
            LatLng latLng1 = new LatLng(coordinates.get(i).latitude, coordinates.get(i).longitude);
            LatLng latLng2 = new LatLng(coordinates.get(i + 1).latitude, coordinates.get(i + 1).longitude);
            canvas.drawLine((LatLngToPoint(latLng1).x), ((LatLngToPoint(latLng1).y)), (LatLngToPoint(latLng2).x), (LatLngToPoint(latLng2).y), paint);
            canvas.drawCircle((LatLngToPoint(latLng1).x),(LatLngToPoint(latLng1).y),5, paint);
        }
        catch(Exception ex){
        }
    }
    return bitmap;
}

Этот код создает мне изображениеэто выглядит так:

enter image description here

Мне нужно, чтобы это изображение полилинии было масштабировано до 1: 10000 или 1: 5000 по отношению к карте Google.И мне нужно, чтобы это изображение было размером около 400x400, потому что мне нужно, чтобы оно использовалось в документе PDF, где очень важен масштаб.

Как я могу установить карту Google в этих масштабах?

Как я могу преобразовать изображение полилинии в эти масштабы?

РЕДАКТИРОВАТЬ: Что я думаю, что я делаю неправильно, используя координаты из вида, как говорит Хавьер Дельгадо ниже.Теперь я пытаюсь использовать координаты с карты, но как преобразовать их в экранные координаты?

РЕДАКТИРОВАТЬ: Это реальные координаты карты, которые создают многоугольник над

    X:         Y:
    57.567177, 25.383375
    57.567391, 25.384218
    57.568717, 25.382321
    57.568159, 25.382033

Как я могу создать растровое изображение полилинии из этих координат?

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

В любом случае, вы можете преобразовать LatLng координаты в "плоский" экран x,y координаты с помощью метода GoogleMap.getProjection().toScreenLocation() и затем выполнить масштабирование на экране x,y координат вокруг центраof polygon.

Для масштабирования вокруг центра многоугольника вы должны реализовать еще несколько аффинных преобразований: преобразовать координаты LatLon вашего многоугольника / прямоугольника в координаты экрана, переместить центр многоугольника в координаты экрана (0,0), умножить экранкоординаты по шкале коэф.Вы можете использовать что-то вроде этого:

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;
}

Использование:

...
scaleFactor = 500.0f;
Projection projection = mGoogleMap.getProjection();
List<Point> scaledPoints = scalePolygonPoints(mPolygon.getPoints(), scaleFactor , projection);
// draw scaledPoints on Bitmap canvas
...
0 голосов
/ 04 декабря 2018

В настоящее время вы получаете координаты из вида.Тем не менее, я думаю, что вы ищете фактические координаты карты.

Вы можете использовать getCameraPosition(), getMyLocation(), getProjection(), getUiSettings() и несколько других, которые предоставят вам информацию о карте, а не вид:

https://developers.google.com/android/reference/com/google/android/gms/maps/GoogleMap

Например, объект CameraPosition даст вам координаты текущего фрагмента карты, видимого для пользователя:

bearing - Direction that the camera is pointing in, in degrees clockwise from north.
target - The location that the camera is pointing at.
tilt - The angle, in degrees, of the camera angle from the nadir (directly facing the Earth).
Zoom - level near the center of the screen.

https://developers.google.com/android/reference/com/google/android/gms/maps/model/CameraPosition

И VisibleRegion

farLeft - LatLng object that defines the far left corner of the camera.
farRight - LatLng object that defines the far right corner of the camera.
latLngBounds - The smallest bounding box that includes the visible region defined in this class.
nearLeft - LatLng object that defines the bottom left corner of the camera.
nearRight - LatLng object that defines the bottom right corner of the camera.

https://developers.google.com/android/reference/com/google/android/gms/maps/model/VisibleRegion

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

https://developers.google.com/android/reference/com/google/android/gms/maps/model/CameraPosition

...