Funktionen zum Laden von Objekten von einer Karte im KML-Format in eine Yandex-Karte

    Die Yandex.Maps-API verfügt über Funktionen zum Laden von geografischen Daten im XML-Format. Die API unterstützt Karten in zwei Formaten: YMapsML und KML. In der Yandex-Technologiedokumentation finden Sie ein Beispiel für die Arbeit mit diesen Formaten.

    In diesem Beispiel können wir davon ausgehen, dass beide Formate aus Sicht der API gleichwertig sind und die Arbeit mit ihnen nicht anders ist. Darüber hinaus bietet Yandex einen Kartendesigner, in dem jeder Karte automatisch Links zu beiden Formaten zugewiesen werden. Diese Links unterscheiden sich nur im Suffix. Eine Karte im YMapsML-Format endet mit einem /, und die Adresse derselben Karte im KML-Format enthält am Ende die Zeichen ".kml".

    Unabhängig vom XML-Format sieht das Laden von Geo-Objekten folgendermaßen aus:
    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);
    });
    


    Wenn wir jedoch beim Booten etwas mit Objekten tun müssen, ist das Format von Bedeutung. Angenommen, wir möchten die Umrissfarbe eines Objekts mit einem bestimmten Namen ändern.

    YMapsML Download Beispiel
    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);
    });
    



    Es stellt sich heraus, dass dieser Code nicht funktioniert, wenn wir die Adresse durch das KML-Format ersetzen, da sich die Sammlung der aus dem KML-Format heruntergeladenen Objekte von der beim Laden von YMapsML erhaltenen unterscheidet. Beim Laden von KML erhalten wir eine Sammlung von Objekten, die aus einem Geo-Objekt bestehen, das selbst eine Sammlung ist. Und dieses verschachtelte Objekt enthält bereits Geo-Objekte, die auf der Karte gezeichnet sind.

    Um eine aus KML geladene Auflistung zu verarbeiten, müssen Sie daher den folgenden Code schreiben:

    KML-Download-Beispiel
    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);
    });
    



    Und damit unser Code nicht vom Format abhängt, müssen wir ihn etwas komplizierter gestalten:

    Von jedem Format herunterladen
    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);
    });
    


    Jetzt auch beliebt: