当前位置: 首页 > news >正文

Python轻松实现某德地图可视化功能

Python轻松实现某德地图可视化,直接给出解决方案

一.、生成网页

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

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

53

54

55

56

57

importpandas as pd

importfolium

fromfoliumimportplugins

importrandom

# 模拟数据生成

defgenerate_mock_data():

# 生成模拟景点数据

locations=[]

base_lat=23.122373

base_lon=113.268027

# 生成100个随机景点数据

foriinrange(100):

# 在基础坐标附近生成随机偏移

lat=base_lat+random.uniform(-0.1,0.1)

lon=base_lon+random.uniform(-0.1,0.1)

locations.append({'lat': lat,'lon': lon})

returnpd.DataFrame(locations)

# 使用模拟数据替代CSV读取

data=generate_mock_data()

# 创建地图,使用高德地图底图(正确配置attribution)

heatmap1=folium.Map(

location=[23.122373,113.268027],

zoom_start=10,

control_scale=True,

tiles='http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}',

attr='&copy; <a href="http://ditu.amap.com/" rel="external nofollow" rel="external nofollow" rel="external nofollow" >高德地图</a>'

)

# 添加中心标记

folium.Marker(

[23.122373,113.268027],

popup='<i>J哥</i>',

icon=folium.Icon(icon='cloud', color='green')

).add_to(heatmap1)

# 检查数据中是否存在lat和lon列

if'lat'indata.columnsand'lon'indata.columns:

# 创建热力图数据

heat_data=[[row["lat"], row["lon"]]forindex, rowindata.iterrows()]

# 添加热力图层

heatmap_layer=plugins.HeatMap(heat_data)

heatmap1.add_child(heatmap_layer)

else:

print("错误:数据中缺少lat或lon列")

print("数据列名:", data.columns.tolist())

# 保存地图

heatmap1.save("folium_map1.html")

print("地图已保存为 folium_map1.html")

print(f"使用了 {len(data)} 个模拟数据点")

frompathlibimportPath

# 路径配置

BASE_DIR=Path(__file__).parent# 脚本所在目录

DB_DIR=BASE_DIR/'图样'

DB_DIR.mkdir(exist_ok=True)

HTML_FILE_PATH=DB_DIR/"002.html"# 明确HTML文件完整路径

# 保存地图

heatmap1.save(DB_DIR/"folium_map1.html")

print("地图已保存为 folium_map1.html")

print(f"使用了 {len(data)} 个模拟数据点")

二、生成服务器网页

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

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

53

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

importpandas as pd

importfolium

fromfoliumimportplugins

importrandom

fromniceguiimportui

importos

importwebbrowser

frompathlibimportPath

# 模拟数据生成

defgenerate_mock_data():

# 生成模拟景点数据

locations=[]

base_lat=23.122373

base_lon=113.268027

# 生成100个随机景点数据

foriinrange(100):

# 在基础坐标附近生成随机偏移

lat=base_lat+random.uniform(-0.1,0.1)

lon=base_lon+random.uniform(-0.1,0.1)

locations.append({'lat': lat,'lon': lon})

returnpd.DataFrame(locations)

# 生成热力图HTML

defgenerate_heatmap_html():

data=generate_mock_data()

# 创建地图,使用高德地图底图

heatmap1=folium.Map(

location=[23.122373,113.268027],

zoom_start=10,

control_scale=True,

tiles='http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}',

attr='&copy; <a href="http://ditu.amap.com/" rel="external nofollow" rel="external nofollow" rel="external nofollow" >高德地图</a>'

)

# 添加中心标记

folium.Marker(

[23.122373,113.268027],

popup='<i>J哥</i>',

icon=folium.Icon(icon='cloud', color='green')

).add_to(heatmap1)

# 检查数据中是否存在lat和lon列

if'lat'indata.columnsand'lon'indata.columns:

# 创建热力图数据

heat_data=[[row["lat"], row["lon"]]forindex, rowindata.iterrows()]

# 添加热力图层

heatmap_layer=plugins.HeatMap(heat_data)

heatmap1.add_child(heatmap_layer)

else:

print("错误:数据中缺少lat或lon列")

print("数据列名:", data.columns.tolist())

# 保存地图到临时文件

temp_file='temp_heatmap.html'

heatmap1.save(temp_file)

returntemp_file

# 创建NiceGUI界面

@ui.page('/')

defmain():

ui.label('热力图可视化').classes('text-2xl font-bold')

# 生成热力图按钮

defshow_heatmap():

html_file=generate_heatmap_html()

# 在新标签页中打开热力图

webbrowser.open(f'file://{os.path.abspath(html_file)}')

ui.notify(f'热力图已生成并打开: {html_file}')

ui.button('生成并查看热力图', on_click=show_heatmap).classes('mt-4')

# 显示数据信息

data=generate_mock_data()

ui.label(f'模拟数据点数量: {len(data)}').classes('mt-4')

# 显示前几行数据

ui.label('前5行数据预览:').classes('mt-4')

# 使用正确的ui.table语法

columns=[

{'name':'index','label':'Index','field':'index'},

{'name':'lat','label':'纬度','field':'lat'},

{'name':'lon','label':'经度','field':'lon'}

]

rows=[{'index': i,'lat': row['lat'],'lon': row['lon']}fori, (idx, row)inenumerate(data.head().iterrows())]

ui.table(columns=columns, rows=rows).classes('w-full')

# 启动应用

if__name__in{"__main__","__mp_main__"}:

ui.run(title='热力图可视化应用', port=8080,reload=True)

改进版

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

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

53

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

115

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

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

importpandas as pd

importfolium

fromfoliumimportplugins

importrandom

fromniceguiimportui

importos

importwebbrowser

frompathlibimportPath

importnumpy as np

importbase64

fromioimportBytesIO

# 模拟数据生成

defgenerate_mock_data():

# 生成模拟景点数据

locations=[]

base_lat=23.122373

base_lon=113.268027

# 生成100个随机景点数据

foriinrange(100):

# 在基础坐标附近生成随机偏移

lat=base_lat+random.uniform(-0.1,0.1)

lon=base_lon+random.uniform(-0.1,0.1)

# 生成随机数值用于条形图高度和颜色

value=random.uniform(1,100)

locations.append({'lat': lat,'lon': lon,'value': value})

returnpd.DataFrame(locations)

# 生成热力图HTML并转换为base64

defgenerate_heatmap_base64():

data=generate_mock_data()

# 创建地图,使用高德地图底图

heatmap1=folium.Map(

location=[23.122373,113.268027],

zoom_start=10,

control_scale=True,

tiles='http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}',

attr='&copy; <a href="http://ditu.amap.com/" rel="external nofollow" rel="external nofollow" rel="external nofollow" >高德地图</a>',

# 设置地图背景为蓝紫色

style='background-color: #4B0082;'

)

# 添加中心标记

folium.Marker(

[23.122373,113.268027],

popup='<i>J哥</i>',

icon=folium.Icon(icon='cloud', color='green')

).add_to(heatmap1)

# 为每个点添加七彩条形图(使用SVG图形)

foridx, rowindata.iterrows():

# 创建SVG条形图元素

svg_bar_html=create_svg_bar(row['value'])

# 计算条形图尺寸(长度变为原来的六倍,宽度为原来的四分之一)

bar_width=9# 5 + 2*2 (原始宽度 + 两边边框)

bar_height=max(int(row['value']/5)*6,30)+4# 高度变为原来的六倍 + 两边边框

ifbar_height <34:# 最小高度调整

bar_height=34

icon=folium.DivIcon(

html=svg_bar_html,

icon_size=(bar_width, bar_height),

icon_anchor=(bar_width//2, bar_height//2)# 锚点设置

)

# 在地图上添加标记

folium.Marker(

[row['lat'], row['lon']],

icon=icon,

popup=f"数值: {row['value']:.2f}"

).add_to(heatmap1)

# 添加颜色条例图

add_smooth_color_legend(heatmap1)

# 将地图保存为HTML字符串

map_html=heatmap1._repr_html_()

returnmap_html

# 创建SVG条形图

defcreate_svg_bar(value):

# 计算条形图尺寸(长度变为原来的六倍,宽度为原来的四分之一)

width=5# 20 / 4

height=max(int(value/5)*6,30)# 高度变为原来的六倍

border_width=2# 黄色边框宽度

svg_width=width+2*border_width

svg_height=height+2*border_width

# 创建渐变定义

gradient_id=f"grad_{int(value * 100)}"

# 生成渐变色条

gradient_html=f'''

<svg width="{svg_width}" height="{svg_height}" xmlns="http://www.w3.org/2000/svg">

<defs>

<linearGradient id="{gradient_id}" x1="0%" y1="100%" x2="0%" y2="0%">

'''

# 添加渐变停止点

num_steps=20

foriinrange(num_steps+1):

stop_value=(i/num_steps)*value

color=get_smooth_color_by_value(stop_value)

offset=i/num_steps

gradient_html+=f'<stop offset="{offset * 100}%" stop-color="{color}" />\n'

gradient_html+=f'''

</linearGradient>

</defs>

<rect x="{border_width}" y="{border_width}" width="{width}" height="{height}"

fill="url(#{gradient_id})" stroke="yellow" stroke-width="{border_width}"/>

</svg>

'''

returngradient_html

# 根据数值映射平滑颜色

defget_smooth_color_by_value(value):

# 归一化数值到0-1范围

normalized_value=min(max(value/100.0,0),1)

# 定义彩虹色谱的关键点

hue=normalized_value*300# 0-300度的色相范围(避免红色重复)

# 将HSV转换为RGB

h=hue/60.0

c=1.0# 饱和度

x=c*(1-abs(h%2-1))

if0<=h <1:

r, g, b=c, x,0

elif1<=h <2:

r, g, b=x, c,0

elif2<=h <3:

r, g, b=0, c, x

elif3<=h <4:

r, g, b=0, x, c

elif4<=h <5:

r, g, b=x,0, c

else:

r, g, b=c,0, x

# 转换为0-255范围

r=int(r*255)

g=int(g*255)

b=int(b*255)

# 转换为十六进制

returnf'#{r:02x}{g:02x}{b:02x}'

# 添加平滑颜色条例图

defadd_smooth_color_legend(m):

# 创建颜色条的HTML(长度变为原来的六倍,宽度为原来的四分之一)

legend_html='''

<div style="

position: fixed;

bottom: 50px;

right: 50px;

z-index:9999;

background-color: white;

padding: 10px;

border:2px solid grey;

border-radius: 5px;

font-size: 14px;

box-shadow: 0 0 10px rgba(0,0,0,0.2);

">

<p style="text-align: center; margin: 0 0 10px 0;"><b>数值范围</b></p>

<div style="display: flex; flex-direction: column; height: 900px; width: 7.5px; margin: 0 auto;">

'''

# 生成渐变色条(长度变为原来的六倍)

foriinrange(100,0,-1):# 从100到1

color=get_smooth_color_by_value(i)

legend_html+=f'<div style="height: 9px; background-color: {color}; border: 0.5px solid black;"></div>'# 1.5px * 6

legend_html+='''

</div>

<div style="display: flex; justify-content: space-between; margin-top: 10px;">

<span>0</span>

<span>50</span>

<span>100</span>

</div>

</div>

'''

m.get_root().html.add_child(folium.Element(legend_html))

# 创建NiceGUI界面

@ui.page('/')

defmain():

ui.label('拉长版平滑过渡七彩条形图').classes('text-2xl font-bold')

# 显示地图

defshow_map():

map_html=generate_heatmap_base64()

# 使用ui.html显示地图,添加sanitize=False参数

ui.html(map_html, sanitize=False).classes('w-full h-screen')

# 显示地图按钮

ui.button('显示地图', on_click=show_map).classes('mt-4')

# 显示数据信息

data=generate_mock_data()

ui.label(f'模拟数据点数量: {len(data)}').classes('mt-4')

# 显示前几行数据

ui.label('前5行数据预览:').classes('mt-4')

# 使用正确的ui.table语法

columns=[

{'name':'index','label':'Index','field':'index'},

{'name':'lat','label':'纬度','field':'lat'},

{'name':'lon','label':'经度','field':'lon'},

{'name':'value','label':'数值','field':'value'}

]

rows=[{'index': i,'lat': row['lat'],'lon': row['lon'],'value': row['value']}fori, (idx, row)inenumerate(data.head().iterrows())]

ui.table(columns=columns, rows=rows).props('dense flat bordered').classes('w-full')

# 启动应用

if__name__in{"__main__","__mp_main__"}:

ui.run(title='拉长版平滑过渡七彩条形图应用', port=8080,reload=False)

到此这篇关于Python轻松实现某德地图可视化功能的文章就介绍到这了

http://www.jsqmd.com/news/581327/

相关文章:

  • 写业务代码必备:9 个被低估的 Python 高效工具库
  • RexUniNLU场景应用:快速构建一个自动化新闻事件抽取工具
  • AI-大模型场景安全性测试
  • Zotero PDF Translate 离线翻译支持:LibreTranslate集成方案与学术场景价值
  • PhotoShop(PS)下载安装指南
  • PyInstxtractor深度实战:解锁PyInstaller加密包逆向分析技术
  • AudioSeal Pixel Studio实操手册:多声道WAV文件水印嵌入兼容性测试报告
  • 如何搭建企业级IP归属地查询平台?
  • SEO_2024年最新SEO策略与方法全面介绍
  • 2026年浙江玻璃液膜蒸发器来图定制,费用多少钱 - 工业设备
  • 如何快速使用fre:ac音频转换工具:新手完整入门指南
  • 新手福音:在快马上手把手学vlookup跨表格匹配(含避坑指南)
  • Qwen3-ForcedAligner-0.6BGPU部署避坑指南:常见OOM错误与解决方案
  • Phi-3-mini-4k-instruct-gguf效果实测:单卡3090上并发3路问答的延迟与显存占用
  • Phi-4-mini-reasoning数学推理benchmark:GSM8K、MATH、AMC实测准确率报告
  • 选购玻璃液膜蒸发器厂要注意什么 - 工业品网
  • 3分钟掌握QQ音乐解密神器qmcdump:轻松转换加密音频格式
  • 量化交易策略开发新范式:StockSharp平台从问题到价值的实现路径
  • Qwen3.5-2B轻量实战:在24GB显存服务器上并发处理8路图文请求
  • 模拟(数青蛙)(5)
  • 创新型GTA模组管理器:高效实现安全管理与动态加载的完整指南
  • Python数据分析神器DuckDB保姆级使用入门指南
  • Linux grep 命令的使用指南
  • 国外行星波动探测数据网站
  • 安徽糕点西点培训学院价格多少钱 - 工业品牌热点
  • AI赋能内网穿透:让快马智能体为你量身定制安全高效的穿透策略
  • Hunyuan-MT-7B部署案例:媒体机构构建多语种新闻快讯自动编译流水线
  • Beyond Compare 5 密钥生成器:Python开源工具的完整高效解决方案
  • Ubuntu安装SSH连接工具FinalShell4.6.4
  • 国内外知名的seo优化公司有哪些_seo优化公司排名靠前的有哪些