KML形式のマップからYandexマップにオブジェクトを読み込む機能

Yandex.Maps APIには、XML形式の地理データを読み込む機能があります。 APIは、YMapsMLとKMLの2つの形式のマップをサポートしています。 Yandexテクノロジーのドキュメントに 、これらの形式の使用方法を示す例があります。



この例を見ると、APIの観点からは、両方の形式が同等であり、それらを操作することも同じであると想定できます。 さらに、Yandexは、各マップに両方の形式へのリンクが自動的に割り当てられるマップデザイナーを提供します。 これらのリンクは、接尾辞のみが異なります。 YMapsML形式のカードは/文字で終わり、末尾のKML形式の同じカードのアドレスには文字「.kml」が含まれます。



XML形式に関係なく、geoオブジェクトのロードは次のようになります。

var map = new ymaps.Map("map", { center: [-25.89, 135.32], zoom: 4, controls: ["zoomControl"] }); var url = "http://maps.yandex.ru/export/usermaps/4c4r9MAwI8DLmJKv1H--R0_bvQmHNLDz/"; ymaps.geoXml.load(url).then(function (res) { map.geoObjects.add(res.geoObjects); });
      
      







ただし、ブート時にオブジェクトを使用して何かを行う必要がある場合は、形式が重要であることがわかります。 特定の名前を持つオブジェクトのアウトラインカラーを変更するとします。



YMapsMLダウンロードの例
 var url = "http://maps.yandex.ru/export/usermaps/4c4r9MAwI8DLmJKv1H--R0_bvQmHNLDz/"; ymaps.geoXml.load(url).then(function (res) { res.geoObjects.each(function (obj) { if (obj.properties.get("name") == " ") { obj.options.set("strokeColor", "0066ffff"); } }); map.geoObjects.add(res.geoObjects); });
      
      









アドレスをKML形式に置き換えた場合、KML形式からダウンロードされたオブジェクトのコレクションはYMapsMLの読み込み時に取得したものとは異なるため、このコードは機能しません。 KMLを読み込むと、それ自体がコレクションである1つのgeoオブジェクトで構成されるオブジェクトのコレクションを取得します。 そして、このネストされたオブジェクトには、すでにマップ上に描かれた地理オブジェクトが含まれています。



したがって、KMLからロードされたコレクションを処理するには、次のコードを記述する必要があります。



KMLダウンロードの例
 var url = "http://maps.yandex.ru/export/usermaps/4c4r9MAwI8DLmJKv1H--R0_bvQmHNLDz.kml"; ymaps.geoXml.load(url).then(function (res) { res.geoObjects.each(function (obj) { obj.each(function (nested) { if (nested.properties.get("name") == " ") { nested.options.set("strokeColor", "0066ffff"); } }); }); map.geoObjects.add(res.geoObjects); });
      
      









そして、コードが形式に依存しないように、もう少し複雑にする必要があります。



任意の形式からダウンロード
 var modifyObj = function (obj) { if (obj.properties.get("name") == " ") { obj.options.set("strokeColor", "0066ffff"); } } ymaps.geoXml.load(url).then(function (res) { res.geoObjects.each(function (obj) { if ("each" in obj && typeof obj.each == "function") { obj.each(function (nested) { modifyObj(nested); }); } else { modifyObj(obj); } }); map.geoObjects.add(res.geoObjects); });
      
      








All Articles