ยูทิลิตีการนำเข้า 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() ในหมุด GroundGround เอกสาร หรือโฟลเดอร์

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

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

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

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

Java


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

      

Kotlin


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

      

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

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

Java


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

      

Kotlin


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

      

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

Java


layer.addLayerToMap();

      

Kotlin


layer.addLayerToMap()

      

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

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

Java


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

      

Kotlin


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

      

หากต้องการนําเลเยอร์ออกจากแผนที่ ให้เรียก removeLayerFromMap():

Java


layer.removeLayerFromMap();

      

Kotlin


layer.removeLayerFromMap()

      

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

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

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

Java


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

      

Kotlin


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

      

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

Java


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

      

Kotlin


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

      

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

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

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

Java


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

      

Kotlin


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

      

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

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

Java


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

      

Kotlin


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

      

กิจกรรมการคลิกรูปเรขาคณิตของ KML

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

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

      

Kotlin


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

      

ดูแอปเดโม

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

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

องค์ประกอบ KML มีการรองรับไหม ความคิดเห็น
<ที่อยู่> บางส่วน จัดเก็บเป็นค่าพร็อพเพอร์ตี้
<AddressDetails> no
<Alias> no
<ระดับความสูง> no
<altitudeMode> no
<atom:author> no
<atom:link> no
<atom:name> no
<BalloonStyle> บางส่วน รองรับเฉพาะ <text>
<begin> ไม่มี <TimeSpan> ไม่ได้รับการสนับสนุน
<bgColor> no
<BottomFov> ไม่มี ไม่สนับสนุน <โฟโต้โอเวอร์>
<กล้องถ่ายรูป> no
<เปลี่ยน> บางส่วน รองรับเฉพาะการเปลี่ยนแปลงรูปแบบเท่านั้น
<color> บางส่วน รวม #AABBGGRR และ #BBGGRR; ไม่สนับสนุนใน <Screenโฆษณาซ้อนทับ> และ <Groundโฆษณาซ้อนทับ>
<colorMode> ใช่
<cookie> no <NetworkLinkControl> ไม่รองรับ
<พิกัด> ใช่
<สร้าง> no
<Data> no
<Delete> no
<description> ใช่ ข้อความธรรมดาเท่านั้น ไม่รองรับเนื้อหา HTML
<displayMode> no
<displayName> no
<เอกสาร> ใช่
<DrawOrder> ใช่
<east> ใช่
<end> ไม่มี <TimeSpan> ไม่ได้รับการสนับสนุน
<expires> no <NetworkLinkControl> ไม่รองรับ
<ExtendedData> บางส่วน &type;lt;Data> เท่านั้น ไม่สนับสนุน <SimpleData> หรือ <สคีมา> และการแทนที่เอนทิตีของแบบฟอร์ม$[dataName]
<extrude> no
<fill> ใช่
<flyToView> no <NetworkLinkControl> ไม่รองรับ
<Folder> ใช่
<gridOrigin> ไม่มี ไม่สนับสนุน <โฟโต้โอเวอร์>
<GroundOver> ใช่
<head> ใช่
<hotSpot> ใช่
<href> ใช่
<httpQuery> no
<Ig> ใช่
<IconStyle> ใช่
<ImagePyramid> ไม่มี ไม่สนับสนุน <โฟโต้โอเวอร์>
<internalBoundaryIs> ใช่ โดยนัยจาก <LinearRing> ลําดับ
<ItemIcon> ไม่มี <ListStyle> ไม่ได้รับการสนับสนุน
<key> ใช่
< KML> ใช่
<LabelStyle> no
<ละติจูด> ใช่
<LatLonAltBox> no
<LatLonBox> ใช่
<leftFov> ไม่มี ไม่สนับสนุน <โฟโต้โอเวอร์>
<LinearRing> ใช่
<LineString> ใช่
<LineStyle> ใช่
<Link> no
<linkDescription> ไม่มี <NetworkLinkControl> ไม่รองรับ
<linkName> ไม่มี <NetworkLinkControl> ไม่รองรับ
<linksnippet> ไม่มี <NetworkLinkControl> ไม่รองรับ
<listItemType> ไม่มี <ListStyle> ไม่ได้รับการสนับสนุน
<ListStyle> no
<ตําแหน่ง> ไม่มี <Model> ไม่ได้รับการสนับสนุน
<Lod> ใช่
<ลองจิจูด> ใช่
<LookAt> no
<maxAltitude> no
<maxFadeExtent> no
<maxHeight> ไม่มี ไม่สนับสนุน <โฟโต้โอเวอร์>
<maxLodPixels> no
<maxSessionLength> no
<maxWidth> ไม่มี ไม่สนับสนุน <โฟโต้โอเวอร์>
<message> no
<minAระดับความสูง> no
<minFadeExtent> no
<minLodPixels> no
<minRefreshPeriod> no <NetworkLink>
<Model> no
<MultiGeometry> ใช่
<name> ใช่
<ใกล้เคียง> ไม่มี ไม่สนับสนุน <โฟโต้โอเวอร์>
<NetworkLink> no
<NetworkLinkControl> no
<north> ใช่
<open> ใช่ จัดเก็บเป็นค่าพร็อพเพอร์ตี้
<การวางแนว> ไม่มี <Model> ไม่ได้รับการสนับสนุน
<outerBoundaryIs> ใช่ โดยนัยจาก <LinearRing> ลําดับ
<outline> ใช่
<โฆษณาซ้อนทับXY> no
<จับคู่> ใช่
<phoneNumber> บางส่วน จัดเก็บเป็นค่าพร็อพเพอร์ตี้
<โฟโต้โอเวอร์> no
<หมุด> ใช่
<Point> ใช่
<Polygon> ใช่
<PolyStyle> ใช่
<range> ใช่
<RefreshInterval> no
<RefreshMode> no
<รีเฟรชระดับการเข้าถึง> no
<ภูมิภาค> ใช่
<Resourcemap> ไม่มี <Model> ไม่ได้รับการสนับสนุน
<rightFov> ไม่มี ไม่สนับสนุน <โฟโต้โอเวอร์>
<roll> ไม่มี <Camera> และ <Model> ไม่ได้รับการสนับสนุน
<การหมุนเวียน> ใช่
<rotationXY> no
<Scale> ไม่มี <Model> ไม่ได้รับการสนับสนุน
<scale> ใช่
<สคีมา> no
<SchemaData> no
<ScreenScreen> no
<screenXY> ไม่มี <ScreenScreen> ใช้ไม่ได้
<รูปร่าง> ไม่มี ไม่สนับสนุน <โฟโต้โอเวอร์>
<SimpleData> ไม่มี <SchemaData> ไม่ได้รับการสนับสนุน
<SimpleField> ไม่มี <Schema> ไม่ได้รับการสนับสนุน
<size> ใช่
<snippet> no
<south> ใช่
<state> ไม่มี <ListStyle> ไม่ได้รับการสนับสนุน
<Style> ใช่
<StyleMap> บางส่วน ไม่ได้ใช้รูปแบบที่ไฮไลต์ ไม่รองรับ StyleMaps ในบรรทัด
<styleUrl> ใช่
<targetHref> no <Alias> ไม่ได้รับการสนับสนุน
<tessellate> no
<text> ใช่
<textColor> no
<tileSize> ไม่มี ไม่สนับสนุน <โฟโต้โอเวอร์>
<เอียง> no
<TimeSpan> no
<TimeStamp> no
<topFov> ไม่มี ไม่สนับสนุน <โฟโต้โอเวอร์>
<อัปเดต> ไม่มี <NetworkLinkControl< ไม่รองรับ
<value> ใช่
<viewBoundScale> no
<viewFormat> no
<viewRefreshMode> no
<viewRefreshTime> no
<ViewVolume> ไม่มี ไม่สนับสนุน <โฟโต้โอเวอร์>
<การมองเห็น> ใช่
<west> ใช่
<เวลา> ไม่มี <TimeStamp> ไม่ได้รับการสนับสนุน
<width> ใช่