Polygon

지도에 원, 삼각형, 사각형 등 닫힌 도형을 표시할 수 있습니다.

1. Polygon 생성하기


Polygon 의 꼭지점에 해당하는 포인트들을 이어서 만듭니다. 이 포인트들의 생성방식과 쓰임에 따라 모델좌표계로 구성하는 DotPoints 과 실제 위치좌표로 구성하는 MapPoints 2가지 방식이 있습니다. 행정구역 표시와 같이 정확한 위치좌표를 가지고 복잡한 형태를 그려야 할 때는 MapPoints 방식이 적합니다.

  • MapPoints - 지도의 위치 좌표들을 꼭지점으로 이어서 도형을 그리는 방식
  • DotPoints - 지도의 특정 위치 좌표를 x, y 축의 (0, 0) 으로 놓고 좌표 상의 포인트들을 이어서 도형을 그리는 방식
MapPoints 로 그리는 방식
DotPoints 로 그리는 방식

MapPoints 로 Polygon 생성하는 방식

  • Polygon 을 만드는 위치 좌표들은 시계방향으로 넣어야 합니다.
  • 시작 위치 좌표와 마지막 위치 좌표는 항상 똑같은 값을 넣어야 합니다.
// 분당구 수내동 좌표 - 좌표는 시계방향, 시작과 마지막 위치좌표가 같아야 한다.
List<LatLng> areaPoints = Arrays.asList(LatLng.from(37.38223932551648, 127.12175541356355),
    LatLng.from(37.38004826841279, 127.11873788114828),
    LatLng.from(37.37998825970411, 127.11865560901997),
    LatLng.from(37.37759015963305, 127.12026455589091),
    LatLng.from(37.37554127232343,127.12166649422632),
    LatLng.from(37.375376651560764, 127.1218294448716),
    LatLng.from(37.37529063800645, 127.12170987089243),
    LatLng.from(37.37476435496199, 127.12097413037237),
    LatLng.from(37.371637030851865, 127.11659848251716),
    LatLng.from(37.375492190509185, 127.11234063682852),
    LatLng.from(37.37851222905698, 127.10900509657834),
    LatLng.from(37.38164690817991, 127.11175544541744),
    LatLng.from(37.386705773112425, 127.11655221282123),
    LatLng.from(37.38223932551648, 127.12175541356355));

PolygonOptions options = PolygonOptions.from(MapPoints.fromLatLng(areaPoints),
        Color.parseColor("#80ff2c35"), 3, Color.RED);

Polygon polygon = shapeManager.getLayer().addPolygon(options);

DotPoints 로 Polygon 생성하는 방식

  • Polygon 을 만드는 포인트들은 시계방향으로 넣어야 합니다.
  • 시작 포인트와 마지막 포인트는 항상 똑같은 값을 넣어야 합니다.
// 가로, 세로 변의 길이가 200 미터(meter) 인 삼각형 폴리곤 - 포인트는 시계방향, 시작과 마지막 포인트는 같아야 한다.
PolygonOptions options = PolygonOptions.from(DotPoints.fromPoints(LatLng.from(37.367317, 127.111764), 
    new PointF(0, 0), new PointF(-200, 0), new PointF(0, 200), 
    new PointF(0, 0)), Color.parseColor("#f55d44"));

Polygon polygon = shapeManager.getLayer().addPolygon(options);    

원형과 사각형 만들기

DotPoints 방식에는 편의상 원형사각형 을 간단하게 그릴 수 있는 함수를 제공하고 있습니다.

// 반지름 200 미터(meter) 의 원형 폴리곤
PolygonOptions circleOptions = PolygonOptions.from(DotPoints.fromCircle(LatLng.from(37.367317, 127.111764), 200))
        .setStylesSet(PolygonStylesSet.from(PolygonStyles.from(Color.parseColor("#078c03"))));

// 가로 세로 200 미터(meter) 의 사각형 폴리곤
PolygonOptions rectangleOptions = PolygonOptions.from(DotPoints.fromRectangle(LatLng.from(37.367317, 127.111764), 200, 200))
        .setStylesSet(PolygonStylesSet.from(PolygonStyles.from(Color.parseColor("#104D73"))));

Polygon circle = shapeManager.getLayer().addPolygon(circleOptions);
Polygon rectangle = shapeManager.getLayer().addPolygon(rectangleOptions);

구멍(Hole)이 있는 원형 만들기

// 반지름 200 미터(meter) 의 원형과 그 안에 반지름 170 미터(meter) 인 원형 구멍이 있는 폴리곤
PolygonOptions options = PolygonOptions.from(DotPoints.fromCircle(LatLng.from(37.367317, 127.111764), 200).setHoleCircle(170))
        .setStylesSet(PolygonStylesSet.from(PolygonStyles.from(Color.parseColor("#abd904"))));
        
Polygon polygon = shapeManager.getLayer().addPolygon(options);

여러개의 Polygon 을 한번에 표시하기 (Multi Polygons)

// PolygonOptions.addPolygon 으로 원하는 폴리곤을 추가하기
PolygonOptions options = PolygonOptions.from(DotPoints.fromPoints(center, new PointF(-450, 150),
        new PointF(-150, 450), new PointF(-150, 150),
        new PointF(-450, 150)), Color.parseColor("#f55d44"))
        .addPolygon(DotPoints.fromPoints(center, new PointF(150, 150), new PointF(250, 350),
                new PointF(550, 350), new PointF(450, 150),
                new PointF(150, 150)), Color.parseColor("#ffc848"))
        .addPolygon(DotPoints.fromCircle(center, 200.0f).setHoleCircle(150.0f),
                Color.parseColor("#2384D9"))
        .addPolygon(DotPoints.fromCircle(center, 120.0f).setHoleCircle(70.0f),
                Color.parseColor("#50c3f2"));

Polygon polygon = shapeManager.getLayer().addPolygon(options);          

2. PolygonStyles 설정하기


PolygonStyles 은 Polygon 의 스타일을 정의하며 1개 이상의 PolygonStyle 로 구성되어 있습니다. 하나의 PolygonStyle 은 지도의 확대/축소 줌레벨마다 스타일을 정의하고 지도의 줌레벨에 따라서 다른 스타일을 적용할 수 있습니다.

확대/축소 줌레벨 마다 다른 스타일 설정 예제

확대/축소 줌레벨의 값이 낮은것부터 순차적으로 넣어야 정상적으로 동작합니다.

// 줌레벨 12, 14, 16 마다 다른 색깔의 스타일의 육각형 폴리곤을 만드는 예제 
PolygonOptions options = PolygonOptions.from(DotPoints.fromPoints(pos, new PointF(-75, 150), new PointF(75, 150),
        new PointF(150, 0), new PointF(75, -150), new PointF(-75, -150),
        new PointF(-150, 0), new PointF(-75, 150)))
        .setStyles(PolygonStyle.from(Color.parseColor("#511f73")).setZoomLevel(12),
                PolygonStyle.from(Color.parseColor("#f28705")).setZoomLevel(14),
                PolygonStyle.from(Color.parseColor("#26a699"),
                        3, Color.parseColor("#f20530")).setZoomLevel(16));

Polygon polygon = shapeManager.getLayer().addPolygon(options);                        

스타일 및 도형 바꾸기

Polygon 생성 후 스타일과 포인트 데이터를 변경 할 수 있습니다.

// 1. 스타일만 변경하는 경우
polygon.changeStyles(PolygonStyles.from(Color.GREEN));

// 2. 스타일과 폴리곤의 데이터도 같이 변경하는 경우 - DotPoints 로 넣을 경우 
DotPoints dotPoints = DotPoints.fromPoints(LatLng.from(37.367317, 127.111764),
                        new PointF(0, 0), new PointF(-200, 0), new PointF(0, 200),
                        new PointF(0, 0));
polygon.changeStylesAndData(PolygonStyles.from(Color.GREEN), dotPoints);

// 3. 스타일과 폴리곤의 데이터도 같이 변경하는 경우 - MapPoints 로 넣을 경우 
List<LatLng> areaPoints = Arrays.asList(LatLng.from(37.38223932551648, 127.12175541356355),
        LatLng.from(37.38004826841279, 127.11873788114828),
        LatLng.from(37.37998825970411, 127.11865560901997),
        LatLng.from(37.37759015963305, 127.12026455589091),
        LatLng.from(37.37554127232343,127.12166649422632),
        LatLng.from(37.375376651560764, 127.1218294448716),
        LatLng.from(37.37529063800645, 127.12170987089243),
        LatLng.from(37.37476435496199, 127.12097413037237),
        LatLng.from(37.371637030851865, 127.11659848251716),
        LatLng.from(37.375492190509185, 127.11234063682852),
        LatLng.from(37.37851222905698, 127.10900509657834),
        LatLng.from(37.38164690817991, 127.11175544541744),
        LatLng.from(37.386705773112425, 127.11655221282123),
        LatLng.from(37.38223932551648, 127.12175541356355));
MapPoints mapPoints = MapPoints.fromLatLng(areaPoints);
polygon.changeStylesAndData(PolygonStyles.from(Color.GREEN), mapPoints);