TimestamedGeoJson持续时间参数会导致面消失

2022-04-13 00:00:00 python geojson folium

问题描述

我在修改Plugins example notebook中第二个TimestamedGeoJson示例的代码片段时遇到问题。

持续时间参数被描述为"要素经过其时间后将在地图上显示的时间段。如果没有,则将显示所有以前的时间。"

以下面的案例为例,使用两个多边形

import folium
from folium.plugins import TimestampedGeoJson

m = folium.Map(location=[52.467697, -2.548828], zoom_start=6)

polygon_1 = {
    'type': 'Feature',
    'geometry': {
        'type': 'MultiPolygon',
        'coordinates': [((
             (-2.548828, 51.467697),
             (-0.087891, 51.536086),
             (-1.516113, 53.800651),
             (-6.240234, 53.383328),
        ),)],
    },
    'properties': {
        'style': {
            'color': 'blue',
        },
        'times': ['2015-07-22T00:00:00', '2015-08-22T00:00:00',
                  '2015-09-22T00:00:00', '2015-10-22T00:00:00',
                  '2015-11-22T00:00:00', '2015-12-22T00:00:00']
    }
}

polygon_2 = {
    'type': 'Feature',
    'geometry': {
        'type': 'MultiPolygon',
        'coordinates': [((
             (-3.548828, 50.467697),
             (-1.087891, 50.536086),
             (-2.516113, 52.800651),
             (-7.240234, 52.383328),
        ),)],
    },
    'properties': {
        'style': {
            'color': 'yellow',
        },
        'times': ['2015-07-22T00:00:00', '2015-08-22T00:00:00']
    }
}

TimestampedGeoJson(
    {'type': 'FeatureCollection', 'features': [polygon_1, polygon_2]},
    period='P1M',
    duration='P1M',
    auto_play=False,
    loop=False,
    loop_button=True,
    date_options='YYYY/MM/DD',
).add_to(m)

m

第一个多边形从7月到12月是活动的,因此我预计它将在所有时间段内绘制;第二个多边形仅在7月和8月活动,因此它应该绘制到最后一个月之后的一个月:即7月、8月和9月。

相反,我看到的是两个多边形都是在第一个阶段绘制的,在第二个阶段消失,然后第二个多边形在9月份绘制,并在10月份再次消失。需要说明的是:

预期

+-----------+----------+----------+
|   Month   | Polygon1 | Polygon2 |
+-----------+----------+----------+
| July      | X        | X        |
| August    | X        | X        |
| September | X        | X        |
| October   | X        |          |
| November  | X        |          |
| December  | X        |          |
+-----------+----------+----------+

观察

+-----------+----------+----------+
|   Month   | Polygon1 | Polygon2 |
+-----------+----------+----------+
| July      | X        | X        |
| August    |          |          |
| September | X        |          |
| October   |          |          |
| November  |          |          |
| December  |          |          |
+-----------+----------+----------+

这是持续时间参数中的错误,还是我遗漏了什么?

我使用的是Folium0.6.0版,没有广告拦截程序。这在jupyter和html导出中都会发生。#894中引入了持续时间参数。


解决方案

由于GitHub和was also answered there都问了同样的问题,下面我将复制粘贴giHub用户andy23512的答案,以帮助那些在giHub上意外找不到答案的人。

下面引述的答案如下:

"根据leaflet.js的相应文件,( https://github.com/socib/Leaflet.TimeDimension/tree/520cb80f645112e242c5160cb44b7d5f2cae380d#ltimedimensionlayergeojson )

CoordTimes、Times或Line Strong Timestamps:可以是 与几何图形(日期字符串或毫秒)相关联。在此情况下, 字符串,则它必须具有与 线条。

这意味着如果要在这6个时间戳显示面, 几何坐标列表的长度应为6,以便指定 要在相应时间戳处显示的多边形。

在本例中,您希望在这6个位置显示相同的面(Polygon1 时间戳。您可以在坐标列表后添加*6以进行复制。

因此符合您预期的代码应该是:

import folium
from folium.plugins import TimestampedGeoJson

m = folium.Map(location=[52.467697, -2.548828], zoom_start=6)

polygon_1 = {
    'type': 'Feature',
    'geometry': {
        'type': 'MultiPolygon',
        'coordinates': [((
             (-2.548828, 51.467697),
             (-0.087891, 51.536086),
             (-1.516113, 53.800651),
             (-6.240234, 53.383328),
        ),)] * 6, # duplicatation for matching 6 timestamps
    },
    'properties': {
        'style': {
            'color': 'blue',
        },
        'times': ['2015-07-22T00:00:00', '2015-08-22T00:00:00',
                  '2015-09-22T00:00:00', '2015-10-22T00:00:00',
                  '2015-11-22T00:00:00', '2015-12-22T00:00:00']
    }
}

polygon_2 = {
    'type': 'Feature',
    'geometry': {
        'type': 'MultiPolygon',
        'coordinates': [((
             (-3.548828, 50.467697),
             (-1.087891, 50.536086),
             (-2.516113, 52.800651),
             (-7.240234, 52.383328),
        ),)] * 2, # duplicatation for matching 2 timestamps
    },
    'properties': {
        'style': {
            'color': 'yellow',
        },
        'times': ['2015-07-22T00:00:00', '2015-08-22T00:00:00']
    }
}

TimestampedGeoJson(
    {'type': 'FeatureCollection', 'features': [polygon_1, polygon_2]},
    period='P1M',
    duration='P1M',
    auto_play=False,
    loop=False,
    loop_button=True,
    date_options='YYYY/MM/DD',
).add_to(m)

m

希望这会有帮助。"

相关文章