Вопрос:

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

android google-maps

57 просмотра

1 ответ

98 Репутация автора

Я разрабатываю приложение для Android. У меня есть многоугольник / прямоугольник с его 4 границами / координатами на карте Google. У меня есть переменная с именем, areaDifferenceкоторый установлен на произвольное значение. Мне нужно взять значение этой переменной и изменить размер прямоугольника. Например, если areaDifferenceустановлено значение 2, мне нужно сделать прямоугольник в два раза больше. Как я могу изменить размер? У меня есть только 4 координаты и переменная области.

Автор: Jaspreet Singh Источник Размещён: 13.01.2018 03:54

Ответы (1)


0 плюса

9012 Репутация автора

Просто преобразуйте координаты LatLon вашего многоугольника / прямоугольника в координаты экрана, умножьте координаты экрана на areaDifferenceи конвертируйте его обратно в LatLon. Что-то вроде того:

Polygon polygon = mGoogleMap.addPolygon(new PolygonOptions()
.add(new LatLng(0, 0), new LatLng(0, 1), new LatLng(1, 1), new LatLng(1, 0))
.strokeColor(Color.RED)
.fillColor(Color.GREEN));

List<LatLng> points = polygon.getPoints();
List<LatLng> scaledPoints = new ArrayList(points.size());

Projection projection = mGoogleMap.getProjection();
for (int i=0; i<points.size(); i++) {
    Point screenPosition = projection.toScreenLocation(points.get(i));
    screenPosition.x = areaDifference * screenPosition.x;
    screenPosition.y = areaDifference * screenPosition.y;
    LatLng latLng = projection.fromScreenLocation(screenPosition);
    scaledPoints.add(latLng);
}
polygon.setPoints(scaledPoints);

Подробнее о масштабировании здесь .

ОБНОВИТЬ:

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

private static List<LatLng> scalePolygonPoints(List<LatLng> points, float scale, Projection projection) {
    List<LatLng> 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);
        LatLng latLng = projection.fromScreenLocation(screenPosition);
        scaledPoints.add(latLng);
    }

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

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

...
areaDifference = 2.0f;
Projection projection = mGoogleMap.getProjection();
List<LatLng> scaledPoints = scalePolygonPoints(mPolygon.getPoints(), areaDifference, projection);
mPolygon.setPoints(scaledPoints);
...
Автор: Andrii Omelchenko Размещён: 13.01.2018 08:59
Вопросы из категории :
32x32