Leaflet - Интерактивная карта хороплет с течением времени

У меня есть данные, скажем, о плотности более 30 районов с 2000 по 2010 год. Я хотел бы сделать интерактивную картографическую карту для каждого года, а затем использовать ползунок (в идеале) или переключатель для выбора между годами.

Я могу получить интерактивность в первый год, но НЕ на слоях в другие годы. Здесь вы можете увидеть рабочий пример, но позвольте мне добавить некоторые детали. ниже:

Для простоты рассмотрим всего два года. blocks1995 имеет неперекрывающиеся многоугольники BlockA и BlockB (два района), а blocks1996 имеет одинаковые блоки. У них есть свойство под названием density, которое создает хороплет:

var blocks1995 = {
    "type": "FeatureCollection",
    "crs": {
        "type": "name",
        "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" }
    },
    "features": [{
        "type": "Feature",
        "properties": { "time": 1995, "density": 3.1, "nameB": "BlockA" },
        "geometry": {
            "type": "Polygon",
            "coordinates": [[[50.0, 29.0],[50.0, 29.99],[50.51, 29.99],[50.0, 29.0]]]
        }
    }, {
        "type": "Feature",
        "properties": { "time": 1995, "density": 1.1, "nameB": "BlockB" },
        "geometry": {
            "type": "Polygon",
            "coordinates": [[[50.01, 30.0],[50.52, 30.0],[50.52, 30.5]]]
        }
    }]
};

var blocks1996 = {
    "type": "FeatureCollection",
    "crs": {
        "type": "name",
        "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" }
    },
    "features": [{
        "type": "Feature",
        "properties": {"year": 1996, "density": 2.2, "name": "BlockA" },
        "geometry": {
            "type": "Polygon",
            "coordinates": [[[50.0, 29.0],[50.0, 29.99],[50.51, 29.99]]]
        }
    }, {
        "type": "Feature",
        "properties": {"year": 1996,"density": 1.2,"name": "BlockB"},
        "geometry": {
            "type": "Polygon",
            "coordinates": [[[50.01, 30.0],[50.52, 30.0],[50.52, 30.5]]]
        }
    }]
};

Я пробовал добавить их в OverlayLayer

var blocks1995Layer = L.layerGroup([ L.geoJson(blocks1995)]),
    blocks1996Layer = L.layerGroup([ L.geoJson(blocks1996)]);


var overlayMaps = {
    "Blocks 1995": blocks1995Layer,
    "Blocks 1996": blocks1996Layer
};

var map = new L.map('map', {layers:[blocks1995Layer]})
    .setView([29, 50], 7);

Я помещаю шаблонный интерактивный код из этого интерактивного учебного пособия по раскадровке листов, а затем добавляю обратно на карту :

geojson = L.geoJson(blocks1995, {
    style: density_style,
    onEachFeature: addToFeature
}).addTo(map);

L.control.layers(null, overlayMaps).addTo(map);

Проблема в том, что я добавляю интерактивность только в blocks1995, но не могу добавить ее в overlayMaps.

Я в порядке, использую подключаемый модуль Leaflet (я пробовал TimeSlider, но также не мог понять).

Другая возможность - объединить две переменные block1995 и block1996 в одну с дополнительной функцией year или time, которая упрощает работу. Идея состоит в том, чтобы Leaflet запрашивал время (скажем, когда ползунок перемещается) и создавал интерактивную хороплету в год.

Спасибо!


person cd98    schedule 27.11.2016    source источник
comment
Вы можете попробовать clearLayers (), когда вы меняете годы и добавляете новые данные. Итак, в основном у вас будет один слой, как в учебнике по хороплетам, но вы очищаете его каждый раз, когда обновляете данные за год.   -  person Alex Parij    schedule 28.11.2016
comment
Привет, @AlexParij, куда мне положить clearLayers()?   -  person cd98    schedule 28.11.2016
comment
Геометрия на каждый год останется прежней? Я имею в виду, что общее количество объектов и их расположение останутся неизменными каждый год?   -  person muzaffar    schedule 21.12.2016
comment
@muzaffar Да, они должны оставаться такими же   -  person cd98    schedule 22.12.2016


Ответы (1)


По сути, вы не добавляете слои для правильного управления. В настоящее время вы делаете это

var blocks1995Layer = L.layerGroup([ L.geoJson(blocks1995)]),
    blocks1996Layer = L.layerGroup([ L.geoJson(blocks1996)]);

var overlayMaps =  {
    "Blocks 1995": blocks1995Layer,
    "Blocks 1996": blocks1996Layer
};

geojson = L.geoJson(blocks1995, {
    style: density_style,
    onEachFeature: addToFeature
}).addTo(map);

Вместо этого попробуйте это

geojson = L.geoJson(blocks1995, {
    style: density_style,
    onEachFeature: addToFeature
}).addTo(map);

geojson1 = L.geoJson(blocks1996, {
    style: density_style,
    onEachFeature: addToFeature
}).addTo(map);

var overlayMaps =  {
    "Blocks 1995": geojson,
    "Blocks 1996": geojson1
};

Здесь рабочий пример

Вот еще один пример, где я реализовал переключатели вместо флажков с помощью < плагин href = "https://github.com/ismyrnow/Leaflet.groupedlayercontrol" rel = "nofollow noreferrer" title = "this"> this

Отредактировано

Согласно вашему комментарию, я создал пример, используя этот плагин для ползунка времени листовки . Вот часть кода.

//I've created 5 geojson layers, in order the slider to look appropriate.
geojson = L.geoJson(blocks1995, {
    style: density_style,
    onEachFeature: addToFeature,
    time: "1995" //this is for labeling, you may alter this value if required
});

geojson1 = L.geoJson(blocks1996, {
    style: density_style,
    onEachFeature: addToFeature,
    time: "1996"
});

geojson2 = L.geoJson(blocks1997, {
    style: density_style,
    onEachFeature: addToFeature,
    time: "1997"
});

geojson3 = L.geoJson(blocks1998, {
    style: density_style,
    onEachFeature: addToFeature,
    time: "1998"
});

geojson4 = L.geoJson(blocks1999, {
    style: density_style,
    onEachFeature: addToFeature,
    time: "1999"
});

//now add each geojson layer to a single layer group, as the slider take only one layer
var layerGroup = L.layerGroup([geojson, geojson1, geojson2, geojson3, geojson4 ]);

//initiate slider, follow = 1 means, show one feature at a time
var sliderControl = L.control.sliderControl({layer:layerGroup, follow: 1});
map.addControl(sliderControl);//add slider to map
sliderControl.startSlider();//starting slider

Вот рабочий пример

person muzaffar    schedule 21.12.2016
comment
это здорово, большое спасибо! Не могли бы вы предоставить пример слайдера на основе вашего кода? - person cd98; 22.12.2016
comment
большой! Я думаю, что слайдер действительно будет хорошо смотреться с данными со временем - person cd98; 23.12.2016
comment
@ cd98 .. Я добавил в ответ пример слайдера - person muzaffar; 24.12.2016
comment
отличная работа, это будет полезно и другим людям! В примере с ползунком у вас есть некоторые остатки из примера с групповыми слоями, которые вы можете удалить (var groups, var layerControl и часть addTo (groups.cities) в конце) - person cd98; 28.12.2016