Google Maps Android GeoJSON 유틸리티

  1. 소개
  2. 지도에 GeoJsonLayer 추가
  3. GeoJsonLayer 삭제
  4. GeoJsonFeature 추가 및 삭제
  5. GeoJsonFeature 및 속성 액세스
  6. GeoJsonLayer 및 GeoJsonFeature 스타일 지정
  7. 데모 앱 보기

소개

GeoJSON은 JSON 데이터 형식의 확장에 속하며 지리적 데이터를 나타냅니다. 이 유틸리티를 사용하면 지리적 지형지물을 GeoJSON 형식으로 저장하고 지도 위에 레이어로 렌더링할 수 있습니다. 지도에서 GeoJSON 데이터를 추가/삭제하려면 addLayerToMap(), removeLayerFromMap()을 각각 호출합니다. 마찬가지로 addFeature(), removeFeature()를 호출하고 GeoJsonFeature 객체를 전달하여 개별 지형지물을 추가하고 삭제할 수도 있습니다. 지형지물에 액세스하려면 getFeatures()를 호출하여 레이어에 추가된 모든 GeoJsonFeature 객체의 반복 가능 항목을 가져옵니다.

또한 getDefaultPointStyle(), getDefaultLineStringStyle() 또는 getDefaultPolygonStyle()을 호출하고 각각에 스타일 옵션을 설정하여 지형지물을 레이어에 추가하기 전에 기본 스타일을 설정할 수 있습니다. 지형지물에서 setPointStyle(), setLineStringStyle() 또는 setPolygonStyle()을 호출하고 관련 스타일 객체를 전달하여 개별 GeoJsonFeature의 스타일을 설정할 수도 있습니다.

지도에 GeoJsonLayer 추가

지도에 GeoJson 레이어를 추가하려면 먼저 GeoJsonLayer 클래스의 인스턴스를 생성합니다. GeoJsonLayer를 인스턴스화하는 방법은 두 가지가 있습니다.

JSONObject에서 가져오려면 다음 항목이 필요합니다.

  • 레이어를 렌더링할 GoogleMap 객체
  • 레이어에 포함될 GeoJSON 데이터가 포함된 JSONObject

자바

JSONObject geoJsonData = // JSONObject containing the GeoJSON data
GeoJsonLayer layer = new GeoJsonLayer(map, geoJsonData);
      

Kotlin

val geoJsonData: JSONObject? = // JSONObject containing the GeoJSON data
val layer = GeoJsonLayer(map, geoJsonData)
      

로컬 GeoJSON 파일에서 가져올 경우 필요한 항목:

  • 레이어를 렌더링할 GoogleMap 객체
  • GeoJSON 데이터가 포함된 로컬 리소스 파일
  • 로컬 리소스 파일을 여는 데 필요한 Context 객체.

자바

GeoJsonLayer layer = new GeoJsonLayer(map, R.raw.geojson_file, context);
      

Kotlin

val layer = GeoJsonLayer(map, R.raw.geojson_file, context)
      

GeoJsonLayer를 만든 후 addLayerToMap()을 호출하여 가져온 데이터를 다음과 같이 지도에 추가합니다.

자바

layer.addLayerToMap();
      

Kotlin

layer.addLayerToMap()
      

GeoJsonLayer 삭제

이 레이어를 추가했다고 가정해 보겠습니다.

자바

JSONObject geoJsonData = // JSONObject containing the GeoJSON data
GeoJsonLayer layer = new GeoJsonLayer(map, geoJsonData);
      

Kotlin

val geoJsonData: JSONObject? = // JSONObject containing the GeoJSON data
val layer = GeoJsonLayer(map, geoJsonData)
      

GeoJsonLayer를 지우려면 removeLayerFromMap()을 호출합니다.

자바

layer.removeLayerFromMap();
      

Kotlin

layer.removeLayerFromMap()
      

GeoJsonFeature 추가 및 삭제

GeoJSON의 지형지물은 "feature" 유형을 가집니다. 여기에는 기하학적 구조와 속성 멤버가 포함되며 선택적으로 경계 상자나 ID가 들어 있습니다.

GeoJsonFeature 객체를 개별적으로 만들어 GeoJsonLayer에 추가할 수 있습니다.

0, 0 지점이 포함되고 속성에 하나의 항목이 있으며 경계 상자가 없는 지형지물을 생성했다고 가정해 보겠습니다.

자바

GeoJsonPoint point = new GeoJsonPoint(new LatLng(0, 0));
HashMap<String, String> properties = new HashMap<>();
properties.put("Ocean", "South Atlantic");
GeoJsonFeature pointFeature = new GeoJsonFeature(point, "Origin", properties, null);
      

Kotlin

val point = GeoJsonPoint(LatLng(0.0, 0.0))
val properties = hashMapOf("Ocean" to "South Atlantic")
val pointFeature = GeoJsonFeature(point, "Origin", properties, null)
      

레이어에 지형지물을 추가하려면 addFeature()를 호출하고 추가할 지형지물을 전달합니다.

자바

layer.addFeature(pointFeature);
      

Kotlin

layer.addFeature(pointFeature)
      

지형지물을 레이어에 추가한 후 삭제하려면 removeFeature()를 호출하고 삭제할 지형지물을 전달합니다.

자바

layer.removeFeature(pointFeature);
      

Kotlin

layer.removeFeature(pointFeature)
      

GeoJsonFeature 및 속성 액세스

레이어에 추가된 모든 GeoJsonFeature에 액세스하려면 생성된 GeoJsonLayer에서 getFeatures()를 호출하면 됩니다. 이렇게 하면 아래와 같이 for-each 루프를 사용해 액세스할 수 있는 GeoJsonFeatures의 iterable이 반환됩니다.

자바

for (GeoJsonFeature feature : layer.getFeatures()) {
    // Do something to the feature
}
      

Kotlin

for (feature in layer.features) {
    // Do something to the feature
}
      

hasProperty(), getProperty() 메서드를 getFeatures() 메서드와 함께 사용하여 저장된 각 지형지물에 특정 속성이 있는지 확인하고 속성이 있으면 액세스합니다.

자바

if (feature.hasProperty("Ocean")) {
    String oceanProperty = feature.getProperty("Ocean");
}
      

Kotlin

if (feature.hasProperty("Ocean")) {
    val oceanProperty = feature.getProperty("Ocean")
}
      

GeoJSON 도형 클릭 이벤트

GeoJsonLayer.OnFeatureClickListener()를 사용하여 지도의 도형 지형지물에서 클릭 이벤트를 수신할 수 있습니다. 사용자가 지형지물을 클릭할 때 지형지물의 제목을 로깅하는 예시는 다음과 같습니다.

자바

// Set a listener for geometry clicked events.
layer.setOnFeatureClickListener(new Layer.OnFeatureClickListener() {
    @Override
    public void onFeatureClick(Feature feature) {
        Log.i("GeoJsonClick", "Feature clicked: " + feature.getProperty("title"));
    }
});
      

Kotlin

// Set a listener for geometry clicked events.
layer.setOnFeatureClickListener { feature ->
    Log.i("GeoJsonClick", "Feature clicked: ${feature.getProperty("title")}")
}
      

GeoJsonLayer 및 GeoJsonFeature 스타일 지정

GeoJsonLayer의 기본 스타일을 설정하거나 레이어에서 개별 지형지물의 스타일을 지정할 수 있습니다.

기본 스타일

GeoJsonLayer에서 레이어에 추가된 점, 유도선 및 다각형에 기본 스타일을 설정할 수 있습니다. 기본 스타일은 지형지물의 기하학적 구조 중 어느 한 쪽에 스타일 세트가 없는 경우에만 적용됩니다. 기본 스타일을 변경하면 기본 스타일을 사용하는 모든 지형지물에 반영됩니다.

기본 스타일을 적용하는 절차는 다음과 같습니다.

  1. 관련 기본 스타일 객체를 검색합니다. GeoJsonPointStyle, GeoJsonLineStringStyle 또는 GeoJsonPolygonStyle 중 하나일 수 있습니다.
  2. 스타일에 원하는 옵션을 적용합니다.

예를 들어, 다음 코드 샘플은 기본 점 스타일을 수정하여 제목과 스니펫이 포함된 드래그 가능한 점을 만드는 방법을 보여줍니다.

자바

GeoJsonPointStyle pointStyle = layer.getDefaultPointStyle();
pointStyle.setDraggable(true);
pointStyle.setTitle("Hello, World!");
pointStyle.setSnippet("I am a draggable marker");
      

Kotlin

val pointStyle = layer.defaultPointStyle
pointStyle.isDraggable = true
pointStyle.title = "Hello, World!"
pointStyle.snippet = "I am a draggable marker"
      

GeoJsonFeature에 관한 특정 스타일 지정

또는 레이어의 개별 지형지물에 대해 스타일을 지정할 수 있습니다. GeoJsonFeature에 스타일을 적용하는 단계는 다음과 같습니다.

  1. 관련 스타일 객체를 만듭니다. 이 객체는 GeoJsonPointStyle, GeoJsonLineStringStyle 또는 GeoJsonPolygonStyle일 수 있습니다.
  2. 스타일에 원하는 옵션을 적용합니다.
  3. 스타일 객체를 GeoJsonFeature의 관련 메서드(setPointStyle(), setLineStringStyle() 또는 setPolygonStyle())로 전달합니다.

예를 들어 GeoJsonFeature의 유도선 스타일을 색상이 빨간색이 되도록 맞춤설정하는 방법은 다음과 같습니다.

자바

// Create a new feature containing a linestring
List<LatLng> lineStringArray = new ArrayList<LatLng>();
lineStringArray.add(new LatLng(0, 0));
lineStringArray.add(new LatLng(50, 50));
GeoJsonLineString lineString = new GeoJsonLineString(lineStringArray);
GeoJsonFeature lineStringFeature = new GeoJsonFeature(lineString, null, null, null);

// Set the color of the linestring to red
GeoJsonLineStringStyle lineStringStyle = new GeoJsonLineStringStyle();
lineStringStyle.setColor(Color.RED);

// Set the style of the feature
lineStringFeature.setLineStringStyle(lineStringStyle);
      

Kotlin

// Create a new feature containing a linestring
val lineStringArray: MutableList<LatLng> = ArrayList()
lineStringArray.add(LatLng(0.0, 0.0))
lineStringArray.add(LatLng(50.0, 50.0))
val lineString = GeoJsonLineString(lineStringArray)
val lineStringFeature = GeoJsonFeature(lineString, null, null, null)

// Set the color of the linestring to red
val lineStringStyle = GeoJsonLineStringStyle()
lineStringStyle.color = Color.RED

// Set the style of the feature
lineStringFeature.lineStringStyle = lineStringStyle
      

데모 앱 보기

URL에서 GeoJSON 파일을 가져오고 이 파일로 레이어를 만드는 예시는 유틸리티 라이브러리와 함께 제공되는 데모 앱에서 GeoJsonDemoActivity를 참조하세요. 설정 가이드는 데모 앱을 실행하는 방법을 보여줍니다.