Клуб API Карт

Как отрисовать мультиполигон?

artrol
30 октября 2016, 06:03

Есть координаты мультиполигона GeoJson, как отрисовать его средствами API?

<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU&coordorder=longlat" type="text/javascript"></script>

<script>
ymaps.ready(function() {
// 0. Создаем карту:
    var map,
        regionName = "Барвихинское поселение",
        center = [37.6174976,55.6506828],
        zoom = 7;

    map = new ymaps.Map('karta', {
        center: center,
        zoom: zoom,
        controls: []
    });
// 1. Запрашиваем через геокодер район (у Яндекса этой возможности пока нет, придется пользоваться OSM)
    var url = "https://nominatim.openstreetmap.org/search";
    var jsondata = $.getJSON(url, {q: regionName, format: "json", polygon_geojson: 1})
        .then(function (data) {
            $.each(data, function(ix, place) {
                if ("relation" == place.osm_type) {
// 2. Создаем полигон с нужными координатами
                    var p = new ymaps.Polygon(place.geojson.coordinates, {
                    hintContent: "Барвихинское поселение"
                }, {
                    fillColor: '#6699ff',
                    // Делаем полигон прозрачным для событий карты.
                    interactivityModel: 'default#transparent',
                    strokeWidth: 2,
                    opacity: 0.3
                });
// 3. Добавляем полигон на карту
                    map.geoObjects.add(p);
                    map.setBounds(map.geoObjects.getBounds())
                }
            });
        }, function (err) {
            console.log(err);
        });
});
</script>

https://nominatim.openstreetmap.org/search.php?q=%D0%91%D0%B0%D1%80%D0%B2%D0%B8%D1%85%D0%B8%D0%BD%D1%81%D0%BA%D0%BE%D0%B5+%D0%BF%D0%BE%D1%81%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5&format=json&polygon_geojson=1

4 комментария
Подписаться на комментарии к посту
Как несколько полигонов
dimik,
а как вытянуть с такого массива каждый полигон отдельно?
artrol,
Посмотри спеку на GeoJSON 
Вот рабочий код:


ymaps.ready(function() {
// 0. Создаем карту
var map,
regionName = "Московская область, Одинцовский район",
center = [37.6174976, 55.6506828],
zoom = 7;
map = new ymaps.Map('karta', {
center: center,
zoom: zoom,
controls: []
});
// 1. Запрашиваем через геокодер район (у Яндекса этой возможности пока нет, придется пользоваться OSM)
var url = "https://nominatim.openstreetmap.org/search";
var jsondata = $.getJSON(url, {
q: regionName,
format: "json",
polygon_geojson: 1
})
.then(function(data) {
$.each(data, function(ix, place) {
// 2. Если район состоит из нескольких полигонов - разбиваем мультиполигон на отдельные полигоны (API Яндекс.Карт не умеет рисовать мультиполигоны GeoJSON).
if ("MultiPolygon" == place.geojson.type) {
place.geojson.coordinates.forEach(function(coords) {
var feat = {
'type': 'Polygon',
'coordinates': coords
};
var p = new ymaps.Polygon(feat.coordinates, {
hintContent: regionName
}, {
fillColor: '#6699ff',
interactivityModel: 'default#transparent',
strokeWidth: 2,
opacity: 0.3
});
// 2.1 Добавляем полигоны на карту
map.geoObjects.add(p);
map.setBounds(map.geoObjects.getBounds())
});
// 3. В другом случае создаем полигон с нужными координатами
} else if ("relation" == place.osm_type) {
var p = new ymaps.Polygon(place.geojson.coordinates, {
hintContent: regionName
}, {
fillColor: '#6699ff',
interactivityModel: 'default#transparent',
strokeWidth: 2,
opacity: 0.3
});
// 3.1 Добавляем полигон на карту
map.geoObjects.add(p);
map.setBounds(map.geoObjects.getBounds())
}
});
}, function(err) {
console.log(err);
});
});