ยูทิลิตีการนำเข้า KML ของ Google Maps

เลือกแพลตฟอร์ม: Android iOS JavaScript
  1. บทนำ
  2. เพิ่มเลเยอร์ KML
  3. ล้างเลเยอร์ KML
  4. เข้าถึงคอนเทนเนอร์ KML
  5. เข้าถึงหมุด KML และการวางซ้อนพื้น KML
  6. เข้าถึงพร็อพเพอร์ตี้ KML
  7. ฟีเจอร์ที่รองรับของ KML

เกริ่นนำ

KML เป็นส่วนขยายของรูปแบบข้อมูล XML และแสดงข้อมูลทางภูมิศาสตร์บนแผนที่ เมื่อใช้ยูทิลิตีนี้ คุณจะสามารถแปลงวัตถุ KML เป็นรูปร่างทางภูมิศาสตร์และแสดงผลเป็นเลเยอร์ที่ด้านบนของแผนที่ได้ หากต้องการเพิ่มและนำข้อมูล KML ออกจากแผนที่ โปรดเรียก addLayerToMap() และ removeLayerFromMap() ตามลำดับ หากต้องการเข้าถึงพร็อพเพอร์ตี้ในออบเจ็กต์ KML ให้เรียกใช้ getProperties() บนหมุด, GroundOverlay, เอกสาร หรือโฟลเดอร์

เพิ่มเลเยอร์ KML ลงในแผนที่

หากต้องการเพิ่มชั้นข้อมูลลงในแผนที่ ก่อนอื่นให้สร้างอินสแตนซ์ของคลาส KmlLayer การสร้าง KmlLayer ทำได้ 2 วิธี

หากต้องการนำเข้าและแสดงผลชุดข้อมูล KML จากทรัพยากรในเครื่อง คุณต้องมีสิ่งต่อไปนี้

  • ออบเจ็กต์ GoogleMap ที่จะแสดงเลเยอร์
  • ไฟล์ทรัพยากรในเครื่องที่มีข้อมูล KML
  • ออบเจ็กต์ Context ซึ่งจำเป็นสำหรับการเปิดไฟล์ทรัพยากรในเครื่อง

Kotlin



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

      

Java


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

      

หากต้องการนำเข้าและแสดงผลชุดข้อมูล KML จากสตรีมในเครื่อง คุณต้องมีสิ่งต่อไปนี้

  • ออบเจ็กต์ GoogleMap ที่จะแสดงเลเยอร์
  • InputStream ที่มีข้อมูล KML
  • ออบเจ็กต์ Context ซึ่งจำเป็นสำหรับการเปิดทรัพยากรในเครื่อง

Kotlin



val inputStream: InputStream? =  // InputStream containing KML data
val layer = KmlLayer(map, inputStream, context)

      

Java


InputStream inputStream = // InputStream containing KML data
KmlLayer layer = new KmlLayer(map, inputStream, context);

      

หลังจากที่คุณสร้าง KmlLayer แล้ว ให้เรียก addLayerToMap()() เพื่อเพิ่มข้อมูลที่นำเข้าลงในแผนที่

Kotlin



layer.addLayerToMap()

      

Java


layer.addLayerToMap();

      

ล้างเลเยอร์ KML

สมมติว่าคุณได้สร้าง KmlLayer นี้:

Kotlin



val inputStream: InputStream? =  // InputStream containing KML data
val layer = KmlLayer(map, inputStream, context)

      

Java


InputStream inputStream = // InputStream containing KML data
KmlLayer layer = new KmlLayer(map, inputStream, context);

      

หากต้องการนำเลเยอร์ออกจากแผนที่ โปรดโทรไปที่ removeLayerFromMap()

Kotlin



layer.removeLayerFromMap()

      

Java


layer.removeLayerFromMap();

      

เข้าถึงคอนเทนเนอร์ KML

หากต้องการเข้าถึงคอนเทนเนอร์ที่เพิ่มลงในเลเยอร์ ให้เรียกใช้ getContainers() ในเลเยอร์ที่สร้างขึ้น หากต้องการตรวจสอบว่าคอนเทนเนอร์ใดมีคอนเทนเนอร์ที่ซ้อนกันหรือไม่ คุณก็เรียกใช้ hasContainers() ได้ หากต้องการเข้าถึงคอนเทนเนอร์ที่ซ้อนกันเหล่านี้ คุณจะเรียกใช้ getContainers() ได้เช่นเดียวกับที่คุณทำได้ในเลเยอร์

วิธีเข้าถึงคอนเทนเนอร์ที่ไม่ได้ฝังอยู่ใน KmlLayer หรือ KmlContainer:

Kotlin



for (containers in layer.containers) {
    // Do something to container
}

      

Java


for (KmlContainer containers : layer.getContainers()) {
    // Do something to container
}

      

วิธีเข้าถึงคอนเทนเนอร์ที่ฝังอยู่ใน KmlLayer หรือ KmlContainer

Kotlin



fun accessContainers(containers: Iterable<KmlContainer>) {
    for (container in containers) {
        if (container.hasContainers()) {
            accessContainers(container.containers)
        }
    }

      

Java


public void accessContainers(Iterable<KmlContainer> containers) {
    for (KmlContainer container : containers) {
        if (container.hasContainers()) {
            accessContainers(container.getContainers());
        }
    }
}

      

เข้าถึงหมุด KML และการวางซ้อนพื้น KML

หากต้องการเข้าถึงหมุดหรือการวางซ้อนพื้นซึ่งเพิ่มไปยังเลเยอร์แล้ว คุณสามารถเรียกใช้ getPlacemarks() หรือ getGroundOverlays() บนเลเยอร์หรือคอนเทนเนอร์ได้ การเรียกค่าใดค่าหนึ่งจะส่งกลับข้อผิดพลาด KmlPlacemarks หรือ KmlGroundOverlays ตามลำดับ

ตัวอย่างเช่น หากต้องการเข้าถึงออบเจ็กต์ KmlPlacemark จากเลเยอร์ ให้ทำดังนี้

Kotlin



for (placemark in layer.placemarks) {
    // Do something to Placemark
}

      

Java


for (KmlPlacemark placemark : layer.getPlacemarks()) {
    // Do something to Placemark
}

      

เข้าถึงพร็อพเพอร์ตี้ KML

หากต้องการเข้าถึงพร็อพเพอร์ตี้ในคอนเทนเนอร์หรือหมุด ให้เรียก getProperty() แล้วระบุคีย์ของพร็อพเพอร์ตี้ให้กับพร็อพเพอร์ตี้นั้น นอกจากนี้ คุณยังโทรหา hasProperty() เพื่อตรวจสอบว่ามีอยู่ได้ด้วย ตัวอย่างนี้แสดงวิธีเรียกข้อมูลค่าพร็อพเพอร์ตี้ "name" จากคอนเทนเนอร์ หากมี

Kotlin



for (container in layer.containers) {
    if (container.hasProperty("name")) {
        Log.i("KML", container.getProperty("name"))
    }
}

      

Java


for (KmlContainer container : layer.getContainers()) {
    if (container.hasProperty("name")) {
        Log.i("KML", container.getProperty("name"));
    }
}

      

เหตุการณ์การคลิกรูปเรขาคณิต KML

คุณสามารถใช้ KmlLayer.OnFeatureClickListener() เพื่อฟังกิจกรรมการคลิกบนฟีเจอร์เรขาคณิตบนแผนที่ ตัวอย่างต่อไปนี้บันทึกรหัสของฟีเจอร์เมื่อผู้ใช้คลิกฟีเจอร์

Kotlin



// Set a listener for geometry clicked events.
layer.setOnFeatureClickListener { feature ->
    Log.i(
        "KML",
        "Feature clicked: " + feature.id
    )
}

      

Java


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

      

ดูแอปเดโม

สำหรับตัวอย่างการนำเข้าไฟล์ KML และสร้างเลเยอร์ด้วยไฟล์ ลองดู KmlDemoActivity ในแอปสาธิตที่มาพร้อมกับไลบรารียูทิลิตี คู่มือการตั้งค่าจะแสดงวิธีเรียกใช้แอปเดโม

ฟีเจอร์ที่รองรับ KML

องค์ประกอบ KML มีการสนับสนุนหรือไม่ ความคิดเห็น
<address> บางส่วน จัดเก็บเป็นค่าพร็อพเพอร์ตี้
<AddressDetails> ไม่
<Alias> ไม่
<altitude> ไม่
<altitudeMode> ไม่
<atom:author> ไม่
<atom:link> ไม่
<atom:name> ไม่
<BalloonStyle> บางส่วน รองรับเฉพาะ <text>
<begin> ไม่มีข้อมูล ไม่รองรับ <TimeSpan>
<bgColor> ไม่
<bottomFov> ไม่มีข้อมูล ไม่รองรับ <PhotoOverlay>
<Camera> ไม่
<เปลี่ยน> บางส่วน รองรับเฉพาะการเปลี่ยนแปลงรูปแบบ
<color> บางส่วน รวม #AABBGGRR และ #BBGGRR แต่ไม่รองรับใน <ScreenOverlay> และ <GroundOverlay>
<colorMode> ใช่
<cookie> ไม่ ไม่รองรับ <NetworkLinkControl>
<coordinates> ใช่
<สร้าง> ไม่
<Data> ไม่
<ลบ> ไม่
<description> ใช่ ข้อความธรรมดาเท่านั้น ไม่รองรับเนื้อหา HTML
<displayMode> ไม่
<displayName> ไม่
<Document> ใช่
<drawOrder> ใช่
<east> ใช่
<end> ไม่มีข้อมูล ไม่รองรับ <TimeSpan>
<expires> ไม่ ไม่รองรับ <NetworkLinkControl>
<ExtendedData> บางส่วน ไม่ได้พิมพ์ <Data> เท่านั้น ไม่มี <SimpleData> หรือ <Schema> และระบบไม่รองรับการแทนที่เอนทิตีของแบบฟอร์ม$[dataName]
<extrude> ไม่
<fill> ใช่
<flyToView> ไม่ ไม่รองรับ <NetworkLinkControl>
<โฟลเดอร์> ใช่
<gridOrigin> ไม่มีข้อมูล ไม่รองรับ <PhotoOverlay>
<GroundOverlay> ใช่
<heading> ใช่
<hotSpot> ใช่
<href> ใช่
<httpQuery> ไม่
<Icon> ใช่
<IconStyle> ใช่
<ImagePyramid> ไม่มีข้อมูล ไม่รองรับ <PhotoOverlay>
<innerBoundaryIs> ใช่ โดยปริยายจากคำสั่งซื้อ <LinearRing>
<ItemIcon> ไม่มีข้อมูล ไม่รองรับ <ListStyle>
<key> ใช่
<kml> ใช่
<LabelStyle> ไม่
<latitude> ใช่
<LatLonAltBox> ไม่
<LatLonBox> ใช่
<leftFov> ไม่มีข้อมูล ไม่รองรับ <PhotoOverlay>
<LinearRing> ใช่
<LineString> ใช่
<LineStyle> ใช่
<Link> ไม่
<linkDescription> ไม่มีข้อมูล ไม่รองรับ <NetworkLinkControl>
<linkName> ไม่มีข้อมูล ไม่รองรับ <NetworkLinkControl>
<linkSnippet> ไม่มีข้อมูล ไม่รองรับ <NetworkLinkControl>
<listItemType> ไม่มีข้อมูล ไม่รองรับ <ListStyle>
<ListStyle> ไม่
<สถานที่ตั้ง> ไม่มีข้อมูล ไม่รองรับ <Model>
<Lod> ใช่
<longitude> ใช่
<LookAt> ไม่
<maxAltitude> ไม่
<maxFadeExtent> ไม่
<maxHeight> ไม่มีข้อมูล ไม่รองรับ <PhotoOverlay>
<maxLodPixels> ไม่
<maxSessionLength> ไม่
<maxWidth> ไม่มีข้อมูล ไม่รองรับ <PhotoOverlay>
<message> ไม่
<minAltitude> ไม่
<minFadeExtent> ไม่
<minLodPixels> ไม่
<minRefreshPeriod> ไม่ <NetworkLink>
<รุ่น> ไม่
<MultiGeometry> ใช่
<name> ใช่
<ใกล้> ไม่มีข้อมูล ไม่รองรับ <PhotoOverlay>
<NetworkLink> ไม่
<NetworkLinkControl> ไม่
<north> ใช่
<open> ใช่ จัดเก็บเป็นค่าพร็อพเพอร์ตี้
<Orientation> ไม่มีข้อมูล ไม่รองรับ <Model>
<outerBoundaryIs> ใช่ โดยปริยายจากคำสั่งซื้อ <LinearRing>
<outline> ใช่
<overlayXY> ไม่
<Pair> ใช่
<phoneNumber> บางส่วน จัดเก็บเป็นค่าพร็อพเพอร์ตี้
<PhotoOverlay> ไม่
<Placemark> ใช่
<Point> ใช่
<Polygon> ใช่
<PolyStyle> ใช่
<range> ใช่
<refreshInterval> ไม่
<refreshMode> ไม่
<refreshVisibility> ไม่
<Region> ใช่
<ResourceMap> ไม่มีข้อมูล ไม่รองรับ <Model>
<rightFov> ไม่มีข้อมูล ไม่รองรับ <PhotoOverlay>
<โรลล์> ไม่มีข้อมูล ไม่รองรับ <camera> และ <Model>
<rotation> ใช่
<rotationXY> ไม่
<สเกล> ไม่มีข้อมูล ไม่รองรับ <Model>
<scale> ใช่
<Schema> ไม่
<SchemaData> ไม่
<ScreenOverlay> ไม่
<screenXY> ไม่มีข้อมูล ไม่รองรับ <ScreenOverlay>
<shape> ไม่มีข้อมูล ไม่รองรับ <PhotoOverlay>
<SimpleData> ไม่มีข้อมูล ไม่รองรับ <SchemaData>
<SimpleField> ไม่มีข้อมูล ไม่รองรับ <สคีมา>
<size> ใช่
<Snippet> ไม่
<south> ใช่
<state> ไม่มีข้อมูล ไม่รองรับ <ListStyle>
<Style> ใช่
<StyleMap> บางส่วน ไม่ได้ระบุรูปแบบที่ไฮไลต์ ไม่รองรับ StyleMaps แบบในบรรทัด
<styleUrl> ใช่
<targetHref> ไม่ ไม่รองรับ <Alias>
<tessellate> ไม่
<text> ใช่
<textColor> ไม่
<tileSize> ไม่มีข้อมูล ไม่รองรับ <PhotoOverlay>
<tilt> ไม่
<TimeSpan> ไม่
<TimeStamp> ไม่
<topFov> ไม่มีข้อมูล ไม่รองรับ <PhotoOverlay>
<อัปเดต> ไม่มีข้อมูล ไม่รองรับ <NetworkLinkControl<
<value> ใช่
<viewBoundScale> ไม่
<viewFormat> ไม่
<viewRefreshMode> ไม่
<viewRefreshTime> ไม่
<ViewVolume> ไม่มีข้อมูล ไม่รองรับ <PhotoOverlay>
<visibility> ใช่
<west> ใช่
<when> ไม่มีข้อมูล ไม่รองรับ <TimeStamp>
<width> ใช่