ยูทิลิตีการนำเข้า 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 ชั้นเรียน การสร้างอินสแตนซ์มี 2 วิธี KmlLayer

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