Skip to content

KeplerVis

可视化类 开普勒可视化类,提供了几何对象和路径的可视化方法

Parameters:

Name Type Description Default
zoom int

缩放层级, 默认15

15
cen_loc list[float, float] or tuple[float, float]

地图中心点经纬度坐标(WGS-84坐标系)

None
show_roads bool

是否在底图上显示路网图层

True
map_style str

地图风格, 可选dark, light, muted, muted_night, satellite

'dark'
Source code in src/gotrackit/visualization.py
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
def __init__(self, zoom: int = 15,
             cen_loc: list[float, float] or tuple[float, float] = None, show_roads: bool = True,
             map_style: str = 'dark'):
    """可视化类
    开普勒可视化类,提供了几何对象和路径的可视化方法

    Args:
        zoom: 缩放层级, 默认15
        cen_loc: 地图中心点经纬度坐标(WGS-84坐标系)
        show_roads: 是否在底图上显示路网图层
        map_style: 地图风格, 可选dark, light, muted, muted_night, satellite

    """
    self.user_config = kepler_config.get_glb_map_config()
    if cen_loc is not None:
        self.user_config["config"]["mapState"]["longitude"] = cen_loc[0]
        self.user_config["config"]["mapState"]["latitude"] = cen_loc[1]
    self.user_config["config"]["mapState"]["zoom"] = int(zoom)
    self.user_config["config"]["mapStyle"]["styleType"] = map_style
    if show_roads:
        self.user_config["config"]["mapStyle"]["visibleLayerGroups"]['road'] = True
    self.data_dict = dict()
    self.geo_count = 1
    self.point_count = 1
    self.trip_count = 1

添加点层 可为底图加上一个点层

Parameters:

Name Type Description Default
data DataFrame

点层图层数据

required
lng_field str

经度字段

'lng'
lat_field str

纬度字段

'lat'
altitude_field str

高度字段

None
layer_id str

图层ID

None
color list or str

点颜色, RGB数值, 如[125, 241, 33]

None
radius float

点的半径大小

3
set_avg_zoom bool

是否自动定位中心点

True
time_field str

时间列字段名称

None
time_format str

时间列的格式化字符串模板

'%Y-%m-%d %H:%M:%S'
time_unit str

时间列的时间单位

's'
speed float

动画播放速度

0.3
tooltip_fields list[str]

参数未启用

None
color_field str

参数未启用

None
color_list list

参数未启用

None

Returns:

Source code in src/gotrackit/visualization.py
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
def add_point_layer(self, data: pd.DataFrame, lng_field: str = 'lng', lat_field: str = 'lat',
                    altitude_field: str = None, layer_id: str = None, color: list or str = None, radius: float = 3,
                    set_avg_zoom: bool = True, time_field: str = None, time_format: str = '%Y-%m-%d %H:%M:%S',
                    time_unit: str = 's', speed: float = 0.3, tooltip_fields: list[str] = None,
                    color_field: str = None, color_list: list = None) -> None:
    """添加点层
    可为底图加上一个点层

    Args:
        data: 点层图层数据
        lng_field: 经度字段
        lat_field: 纬度字段
        altitude_field: 高度字段
        layer_id: 图层ID
        color: 点颜色, RGB数值, 如[125, 241, 33]
        radius: 点的半径大小
        set_avg_zoom: 是否自动定位中心点
        time_field: 时间列字段名称
        time_format: 时间列的格式化字符串模板
        time_unit: 时间列的时间单位
        speed: 动画播放速度
        tooltip_fields: 参数未启用
        color_field: 参数未启用
        color_list: 参数未启用

    Returns:
    """
    layer_config = self.get_base_layer()
    layer_id = layer_id if layer_id is not None else rf'point-{self.point_count}'
    layer_config['id'] = layer_id
    layer_config["type"] = 'point'
    layer_config['config']['dataId'] = layer_id
    layer_config['config']['label'] = layer_id
    layer_config["config"]["columns"] = {"lat": lat_field, "lng": lng_field}
    if altitude_field is not None:
        layer_config["config"]["columns"]["altitude"] = altitude_field
    layer_config['config']['color'] = self.get_rgb_by_name(color, default_rgb=[65, 72, 88])
    layer_config["config"]["visConfig"]["radius"] = radius
    if color_field is not None:
        layer_config['visualChannels']['colorField'] = {'name': color_field,
                                                        'type': 'string'}
        layer_config['config']['visConfig']['colorRange'] = {'name': 'Custom Palette', 'type': 'custom',
                                                             'category': 'Custom', 'colors': color_list,
                                                             'reversed': False}

    self.user_config["config"]["visState"]["layers"].append(layer_config)

    if time_field is not None and time_field in data.columns:
        self.user_config['config']['visState']['filters'].append(
            self.__format_time_filter(data=data, time_field=time_field,
                                      time_format=time_format, time_unit=time_unit,
                                      layer_id=layer_id, speed=speed))
    if set_avg_zoom:
        cen_x, cen_y = get_avg_loc(df=data, x_field=lng_field, y_field=lat_field)
        self.user_config["config"]["mapState"]["longitude"] = cen_x
        self.user_config["config"]["mapState"]["latitude"] = cen_y
    self.data_dict[layer_id] = data
    if tooltip_fields is not None:
        self.user_config["config"]["visState"]["interactionConfig"]["tooltip"]["fieldsToShow"][
            layer_id] = self.tooltip_config(field_list=tooltip_fields)
    self.point_count += 1

添加几何图层 可为底图加上一个几何图层(即含有geometry几何列)

Parameters:

Name Type Description Default
data GeoDataFrame

几何图层数据

required
layer_id str

图层ID

None
color list or str

填充颜色(RGB色值), 默认[65, 72, 88]

None
stroke_color list or str

边缘填充颜色(RGB色值), 默认[65, 72, 88]

None
width float

是否自动定位中心点

0.3
time_field str

时间列字段名称

None
time_format str

时间列的格式化字符串模板

'%Y-%m-%d %H:%M:%S'
time_unit str

时间列的时间单位

's'
speed float

动画播放速度

0.3
set_avg_zoom bool

是否自动定位中心点

True
tooltip_fields list[str]

参数未启用

None
color_field str

参数未启用

None
color_list list

参数未启用

None

Returns:

Source code in src/gotrackit/visualization.py
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
def add_geo_layer(self, data: gpd.GeoDataFrame, layer_id: str = None, color: list or str = None,
                  stroke_color: list or str = None,
                  width: float = 0.3, time_field: str = None,
                  time_format: str = '%Y-%m-%d %H:%M:%S', time_unit: str = 's',
                  speed: float = 0.3, set_avg_zoom: bool = True, tooltip_fields: list[str] = None,
                  color_field: str = None, color_list: list = None):
    """添加几何图层
    可为底图加上一个几何图层(即含有geometry几何列)

    Args:
        data: 几何图层数据
        layer_id: 图层ID
        color: 填充颜色(RGB色值), 默认[65, 72, 88]
        stroke_color: 边缘填充颜色(RGB色值), 默认[65, 72, 88]
        width: 是否自动定位中心点
        time_field: 时间列字段名称
        time_format: 时间列的格式化字符串模板
        time_unit: 时间列的时间单位
        speed: 动画播放速度
        set_avg_zoom: 是否自动定位中心点
        tooltip_fields: 参数未启用
        color_field: 参数未启用
        color_list: 参数未启用

    Returns:
    """
    layer_config = self.get_base_layer()
    layer_id = layer_id if layer_id is not None else rf'geo-{self.geo_count}'
    layer_config['id'] = layer_id
    layer_config['type'] = 'geojson'
    layer_config['config']['dataId'] = layer_id
    layer_config['config']['label'] = layer_id
    layer_config["config"]["columns"] = {"geojson": 'geometry'}
    layer_config['config']['color'] = self.get_rgb_by_name(color, default_rgb=[100, 100, 100])
    layer_config['config']["visConfig"]['strokeColor'] = self.get_rgb_by_name(color, default_rgb=[100, 100, 100])
    layer_config['config']["visConfig"]['strokeColor'] = stroke_color
    layer_config['config']["visConfig"]['thickness'] = width
    if color_field is not None:
        layer_config['visualChannels']['colorField'] = {'name': color_field,
                                                        'type': 'string'}
        layer_config['config']['visConfig']['colorRange'] = {'name': 'Custom Palette', 'type': 'custom',
                                                             'category': 'Custom', 'colors': color_list,
                                                             'reversed': False}

    self.user_config["config"]["visState"]["layers"].append(layer_config)
    if time_field is not None and time_field in data.columns:
        self.user_config['config']['visState']['filters'].append(
            self.__format_time_filter(data=data, time_field=time_field,
                                      time_format=time_format, time_unit=time_unit,
                                      layer_id=layer_id, speed=speed))
    if set_avg_zoom:
        geo = data['geometry'].iloc[int(len(data) / 2)]
        _ = geo.buffer(0.0001).centroid
        self.user_config["config"]["mapState"]["longitude"] = _.x
        self.user_config["config"]["mapState"]["latitude"] = _.y
    self.data_dict[layer_id] = data
    if tooltip_fields is not None:
        self.user_config["config"]["visState"]["interactionConfig"]["tooltip"]["fieldsToShow"][
            layer_id] = self.tooltip_config(field_list=tooltip_fields)
    self.geo_count += 1

添加路径动画图层 可为底图加上一个路径动画图层(带时间字段的轨迹数据)

Parameters:

Name Type Description Default
data DataFrame

轨迹数据

required
lng_field str

经度字段

'lng'
lat_field str

纬度字段

'lat'
altitude_field str

高度字段

None
time_format str

时间列的格式化字符串模板

'%Y-%m-%d %H:%M:%S'
time_unit str

时间列的时间单位

's'
layer_id str

图层ID

None
set_avg_zoom bool

是否自动定位中心点

True
thickness float

轨迹的显示宽度

2.0
trail_length float

路径拖尾长度

120.0
opacity float

轨迹的透明度

0.8
color list or str

轨迹的颜色(RGB色值), 默认[241, 225, 37]

None
tooltip_fields list[str]

参数未启用

None

Returns:

Source code in src/gotrackit/visualization.py
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
def add_trip_layer(self, data: pd.DataFrame, lng_field: str = 'lng', lat_field: str = 'lat',
                   altitude_field: str = None,
                   time_format: str = '%Y-%m-%d %H:%M:%S', time_unit: str = 's', layer_id: str = None,
                   thickness: float = 2.0, set_avg_zoom: bool = True,
                   opacity: float = 0.8, color: list or str = None,
                   trail_length: float = 120.0, tooltip_fields: list[str] = None):
    """添加路径动画图层
    可为底图加上一个路径动画图层(带时间字段的轨迹数据)

    Args:
        data: 轨迹数据
        lng_field: 经度字段
        lat_field: 纬度字段
        altitude_field: 高度字段
        time_format: 时间列的格式化字符串模板
        time_unit: 时间列的时间单位
        layer_id: 图层ID
        set_avg_zoom: 是否自动定位中心点
        thickness: 轨迹的显示宽度
        trail_length: 路径拖尾长度
        opacity: 轨迹的透明度
        color: 轨迹的颜色(RGB色值), 默认[241, 225, 37]
        tooltip_fields: 参数未启用

    Returns:
    """
    layer_config = self.get_base_layer()
    trip_data = generate_trip_layer(match_res_df=data, time_format=time_format, time_unit=time_unit,
                                    lng_field=lng_field, lat_field=lat_field, altitude_field=altitude_field)
    if set_avg_zoom:
        cen_x, cen_y = get_avg_loc(df=data, x_field=lng_field, y_field=lat_field)
        self.user_config["config"]["mapState"]["longitude"] = cen_x
        self.user_config["config"]["mapState"]["latitude"] = cen_y
    del data
    layer_id = layer_id if layer_id is not None else rf'trip-{self.trip_count}'
    layer_config['id'] = layer_id
    layer_config['type'] = 'trip'
    layer_config['config']['dataId'] = layer_id
    layer_config['config']['label'] = layer_id
    layer_config['config']['color'] = self.get_rgb_by_name(color, default_rgb=[241, 225, 37])
    layer_config["config"]["columns"] = {"geojson": '_geojson'}
    layer_config['config']["visConfig"]['thickness'] = thickness
    layer_config['config']["visConfig"]['opacity'] = opacity
    layer_config['config']["visConfig"]['trailLength'] = int(trail_length)
    self.user_config["config"]["visState"]["layers"].append(layer_config)
    self.data_dict[layer_id] = trip_data

    if tooltip_fields is not None:
        self.user_config["config"]["visState"]["interactionConfig"]["tooltip"]["fieldsToShow"][
            layer_id] = self.tooltip_config(field_list=tooltip_fields)
    self.trip_count += 1

HTML输出 将可视化HTML存储到磁盘且返回Map对象

Parameters:

Name Type Description Default
height float

地图对象的高度

600
out_fldr str

存储HTML的目录

None
file_name str

HTML文件的名称

'map'

Returns:

Type Description

Kepler Map

Source code in src/gotrackit/visualization.py
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
def export_html(self, height: float = 600, out_fldr: str = None, file_name: str = 'map'):
    """HTML输出
    将可视化HTML存储到磁盘且返回Map对象

    Args:
        height: 地图对象的高度
        out_fldr: 存储HTML的目录
        file_name: HTML文件的名称

    Returns:
        Kepler Map
    """
    try:
        user_map = KeplerGl(height=height, data=self.data_dict)  # data以图层名为键,对应的矢量数据为值
    except:
        user_map = KeplerGl(height=height)  # data以图层名为键,对应的矢量数据为值
        for key in self.data_dict.keys():
            user_map.add_data(self.data_dict[key], name=key)
    user_map.config = self.user_config
    if out_fldr is not None:
        user_map.save_to_html(file_name=os.path.join(out_fldr, file_name + '.html'))  # 导出到本地可编辑html文件
    return user_map