【python绘制地图——使用folium制作地图,可解决多数问题】

news2024/11/22 9:56:39

Python使用folium制作地图并生成png图片

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
第一章 使用folium制作地图
第二章 使用Html2Image生成png图片
第三章 使用reportlab制作pdf报告


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • Python使用folium制作地图并生成png图片
  • 前言
  • 一、​folium是什么?
  • 二、使用步骤
    • 1.安装和导入库
    • 2.创建地图或图层
    • 3.添加覆盖物
    • 4.地图参数
    • 5.生成html
    • 6.其他
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:
我讲一下我这个需求的来源,做的项目是一个地理空间查询和使用的系统,通过在前端调用高德地图api创建了一个查询区域,获取区域内的地理数据。具体的需求就是,将查询区域和地理数据制作成一个覆盖率分析报告,报告中的其他内容都已经完成,但是报告中需要展示高德地图、查询区域、地理数据的完整图片这个功能卡了2个星期,主要原因是我对地理空间数据不熟悉,很多python相关库也不清楚,在构建图形的过程中走了很多弯路。
现在将整个实现过程梳理完成,希望对各位同道有帮助,跟其他文章和官网不同,本博客是以使用的优先级来讲解这个库。<我们靠所得来谋生,但靠给予来创造生活>


提示:以下是本篇文章正文内容,下面案例可供参考

一、​folium是什么?

​folium是js上著名的地理信息可视化库leafet.js为Python提供的接口,通过它,我们可以通过在Python端编写代码操纵数据,来调用leaflet的相关功能,基于内建的osm或自行获取的osm资源和地图原件进行地理信息内容的可视化,以及制作优美的可交互地图,是通过不断添加图层元素来定义一个Map对象,最后以几种方式将Map对象展现出来。

而在Map对象的生成形式上,可以在定义所有的图层内容之后,将其保存为html文件在浏览器中独立显示,也可以基于jupyter notebook在一个ipynb文件嵌入对应的交互地图。

二、使用步骤

1.安装和导入库

官网链接:https://pypi.org/project/folium/

pip install folium

代码如下(示例):

import folium

2.创建地图或图层

如何对地图没有要求,可以直接创建地图,但是对地图有要求,可以通过设置参数或加载图层来实现。

def map2png(map_data,out_file='pdf.png'):
	# 1.直接构造,默认底图
	mo = folium.Map(location=[45.5236, -122.6750])
	# 2.替换成高德底图
    mo = folium.Map(location=location,  # [39.917834, 116.397036]
                    zoom_start=zoom_start,  # 13
                    tiles='http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}')
    # 3.添加图层
    mo = folium.Map(location=location,  # [39.917834, 116.397036]
                    zoom_start=zoom_start,  # 13
                    tiles=None)
    folium.TileLayer(
        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/>高德地图</a>",
        min_zoom=0,
        max_zoom=19,
        control=True,
        show=True).add_to(mo)
   	mo.save('test.html')

3.添加覆盖物

覆盖物就是地理空间常用的数据,包括点线面等,数据有多种来源,可以是数据库读出来、文件读出来的、或者网络传输geojson等。

import folium

def map2png(map_data,out_file='pdf.png'):
	# 1.直接构造,默认底图
	mo = folium.Map(location=[45.5236, -122.6750])
    # 添加一个点
	folium.Marker(
		location=[45.3311, -121.7113],
		popup="Timberline Lodge",
		icon=folium.Icon(color="green"),).add_to(m)
 #  添加一个线形   
	folium.PolyLine(
		location=[[38.68,115.67],
					[38.85,115.48],
					[38.65,115.37],
					[38.68,115.67]],
		popup="Timberline Lodge",
		icon=folium.Icon(color="green"),).add_to(m)
 # 添加一个面
    folium.Polygon(
	    locations=[[38.68,115.67],
					[38.85,115.48],
					[38.65,115.37],
					[38.68,115.67]], 
		color='green', 
		fill=True, weight=2).add_to(mo)
	mo.save('test.html')

4.地图参数

我为什要在画完地图和覆盖物之后才说参数?我不可能坑同学。
folium的Map参数有很多,常用的比如location和zoom_start。很多时候都是创建地图的时候就带着(这不是很正确)。创建地图的的时候,我们很多时候是不知道地图的中心点和缩放级别的,这样就很麻烦,还要肉眼去看,一次次的调整。
Map有一个方法fit_bounds,可以实现根据图形内容自动调整中心点和缩放级别,fit_bounds方法的参数跟点线面的参数时一样的。使用fit_bounds的时候尽量不要设置location参数,使用[0,0]值。

import folium

def map2png(map_data,out_file='pdf.png'):
	# 1.直接构造,默认底图
	mo = folium.Map(location=[0, 0])
    # 添加一个点
	folium.Marker(
		location=[45.3311, -121.7113],
		popup="Timberline Lodge",
		icon=folium.Icon(color="green"),).add_to(m)
 #  添加一个线形   
	folium.PolyLine(
		location=[[38.68,115.67],
					[38.85,115.48],
					[38.65,115.37],
					[38.68,115.67]],
		popup="Timberline Lodge",
		icon=folium.Icon(color="green"),).add_to(m)
 # 添加一个面
    folium.Polygon(
	    locations=[[38.68,115.67],
					[38.85,115.48],
					[38.65,115.37],
					[38.68,115.67]], 
		color='green', 
		fill=True, weight=2).add_to(mo)
    mo.fit_bounds([[38.68,115.67],
					[38.85,115.48],
					[38.65,115.37],
					[38.68,115.67]])  # 根据范围缩放地图
	mo.save('test.html')

其他参数和方法我这里列举出来,供同学们参考。

folium.Map(
    location=None,  # 中心点
    width='100%',  # 基于浏览器左上角的屏幕宽的比例
    height='100%',  # 基于浏览器左上角的屏幕高德比例
    left='0%',  # 基于浏览器左侧占比
    top='0%',  # 基于浏览器顶部占比
    position='relative',  # 地图位置
    tiles='OpenStreetMap',  # 多个str参数(map自己的),也可以是瓦片
    attr=None,  # 设置瓦片时,需要传值
    min_zoom=0,  # 最小缩放级别
    max_zoom=18,  # 最大缩放级别 30
    zoom_start=10, # 开始缩放级别
    min_lat=-90,
    max_lat=90,
    min_lon=-180,
    max_lon=180,
    max_bounds=False,
    crs='EPSG3857', # 定义投影地理点的坐标参考系
    control_scale=False,
    prefer_canvas=False,
    no_touch=False,  # 是否禁止手动操作,默认为False
    disable_3d=False, # 加速CSS 3D加载
    png_enabled=False, # map是否可以生成图片,设置为true后可以使用map._to_png(),不建议使用,需要服务器安装浏览器包而且他的方法过时了。
    zoom_control=True, # 地图上显示缩放控件,默认为True
    **kwargs}
)

5.生成html

map.save()函数会生成一个html网页,默认保存在py的同一级目录下,因为我们项目的需求,保存成html在读出来生成png,这个读写过程有点浪费,所以我这里获取到html的页面内容,不调用save方法,直接将html的内容创给html2image生成图片。

import folium

def map2png(map_data,out_file='pdf.png'):
	# 1.直接构造,默认底图
	mo = folium.Map(location=[0, 0])
    # 添加一个点
	folium.Marker(
		location=[45.3311, -121.7113],
		popup="Timberline Lodge",
		icon=folium.Icon(color="green"),).add_to(m)
 #  添加一个线形   
	folium.PolyLine(
		location=[[38.68,115.67],
					[38.85,115.48],
					[38.65,115.37],
					[38.68,115.67]],
		popup="Timberline Lodge",
		icon=folium.Icon(color="green"),).add_to(m)
 # 添加一个面
    folium.Polygon(
	    locations=[[38.68,115.67],
					[38.85,115.48],
					[38.65,115.37],
					[38.68,115.67]], 
		color='green', 
		fill=True, weight=2).add_to(mo)
    mo.fit_bounds([[38.68,115.67],
					[38.85,115.48],
					[38.65,115.37],
					[38.68,115.67]])  # 根据范围缩放地图
    root = mo.get_root()
    html = root.render()  # 这个拿到的就是一个html的内容
    # mo.save('text.html')

6.其他

本博客开始我就介绍了,folium是js上著名的地理信息可视化库leafet.js为Python提供的接口,我们看下就提都调用了那些接口,主要是些js+css。因为中所周知的原因,国内访问国外的接口会存在限制,这些借口在未来可能成为程序的漏洞(有些无法加载,这里不考虑图层瓦片,至少可以用国内图层对吧)。# noqa标记的就是告诉程序可能出错的,忽略警告。

_default_js = [
    ('leaflet',
     'https://cdn.jsdelivr.net/npm/leaflet@1.6.0/dist/leaflet.js'),
    ('jquery',
     'https://code.jquery.com/jquery-1.12.4.min.js'),
    ('bootstrap',
     'https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js'),
    ('awesome_markers',
     'https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.js'),  # noqa
    ]

_default_css = [
    ('leaflet_css',
     'https://cdn.jsdelivr.net/npm/leaflet@1.6.0/dist/leaflet.css'),
    ('bootstrap_css',
     'https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css'),
    ('bootstrap_theme_css',
     'https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css'),  # noqa
    ('awesome_markers_font_css',
     'https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css'),  # noqa
    ('awesome_markers_css',
     'https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.css'),  # noqa
    ('awesome_rotate_css',
     'https://cdn.jsdelivr.net/gh/python-visualization/folium/folium/templates/leaflet.awesome.rotate.min.css'),  # noqa
    ]

在这里插入图片描述
针对可能出现的加载问题,建议将这些库文件放在本地,替换html中的链接。
此处可参考https://blog.csdn.net/weixin_42148809/article/details/120969710

总结

提示:这里对文章进行总结:

本博客是以使用的优先级来讲解这个库。<我们靠所得来谋生,但靠给予来创造生活>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/91726.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaWeb:Mysql(数据库管理系统)、Navicat(Mysql的图形化工具)

MyBatis是对JDBC的简化 以后的升级框架&#xff0c;基本都是围绕 JavaWeb程序 所做的升级 Mysql就是一个数据库管理系统&#xff0c;在系统里可以创建一个个数据库&#xff0c;即DBMS中创建一个个DB Mysqul官网https://downloads.mysql.com/archives/community/ 选择5.7.2…

PCB设计—AD20和立创EDA设计(1)创建项目

&#xff08;1&#xff09;纯新手建议先利用立创EDA画一个PCB&#xff0c;对PCB有一个简单的了解再学习AD20。 &#xff08;2&#xff09;立创EDA教程&#xff1a;立创EDA极速入门&#xff08;1&#xff09;——熟悉PCB和立创EDA基本操作&#xff1b;立创EDA极速入门&#xff0…

《纳瓦尔宝典》笔记二——停止出卖时间后,如何才能有收入

目录 一、引言 二、经典观点 1、没有捷径成功&#xff0c;所以不要抱走捷径心态 2、书的价值 3、一种杠杆-资产&#xff08;公司、股票、实业&#xff09;或被动收入&#xff08;媒体或代码&#xff09; 4、薪水与财富的区别 5、把自己产品化 6、共事的人和工作的内容比…

C# .net 接口接收不同类型参数

public ActionResult ccbwx_notifyurl() { #region 请求参数 Hashtable has new Hashtable(); System.Collections.Specialized.NameValueCollection collection; //if (this.HttpContext.Request.HttpMethod.ToUppe…

前端基础(八)_盒子模型(标准盒子模型和怪异盒子模型)

盒子模型 什么是盒子模型 网页设计中常听的属性名&#xff1a;内容(content)、内边距(padding)、边框(border)、外边距(margin)&#xff0c; CSS盒子模型都具备这些属性。这些属性我们可以用日常生活中的常见事物——盒子作一个比喻来理解&#xff0c;所以叫它盒子模型。CSS盒…

Jenkins 解决GIT部署出现连续SCM部署的问题

背景 最近在工作中用Jenkins部署项目代码&#xff0c;但是每当我选择好了Gittag参数进行部署时会出现两个Job 其中一个Job是由我本人创建的&#xff0c;还有一个Job是由SCM自动创建的&#xff0c;而且由SCM自动创建的Gittag参数是默认值。 我想关闭这个SCM构建&#xff0c;但是…

模板方法模式(Template Method)

参考&#xff1a; 模板方法设计模式 (refactoringguru.cn) design-patterns-cpp/TemplateMethod.cpp at master JakubVojvoda/design-patterns-cpp GitHubhttps://github.com/JakubVojvoda/design-patterns-cpp/blob/master/state/State.cpp) 文章目录一、什么是模板方法模…

41_STM32CAN外设简介

目录 STM32的CAN外设简介 CAN控制内核 工作模式 位时序及波特率 CAN发送邮箱 CAN接收FIFO 验收筛选器 筛选器设置举例 STM32的CAN外设简介 STM32的芯片中具有bxCAN控制器(Basic Extended CAN),它支持CAN协议2.0A和2.0B标准。 该CAN控制器支持最高的通讯速率为1Mb/s;可…

汉字风格迁移篇--KAGAN:一种中国诗歌风格转换的方法

🚀针对问题: 以往的方法都是针对单字图像,容易忽略了中文句子或一张图像中包含的多个字符。 🚀提出的方法: Constancy Loss, Smooth L1 loss;TV loss ,key-attention mechanism GAN;多通道鉴别器 🚀使用的指标 L1 Loss ,SSIM, PSNR, LPIPS 已有工作 字符风…

LiveGBS国标流媒体平台-海康NVR摄像机自带物联网卡摄像头注册GB/T28181国标平台看不到设备的时候如何抓包及排查

GB/T28181国标流媒体平台海康大华宇视华为等硬件NVR摄像机注册到LiveGBS国标平台看不到设备的时候如何抓包及排查1、设备注册后查看不到1.1、是否是自带物联网卡的摄像头1.2、关闭萤石云1.3、防火墙排查1.4、端口排查1.5、IP地址排查1.6、设备TCP/IP配置排查1.7、设备多网卡排查…

java计算机毕业设计基于安卓Android的学生作业管理系统APP

项目介绍 网络的广泛应用给生活带来了十分的便利。所以把学生作业管理与现在网络相结合,利用java技术建设学生作业管理APP,实现学生作业管理的信息化。则对于进一步提高学生作业管理发展,丰富学生作业管理经验能起到不少的促进作用。 学生作业管理APP能够通过互联网得到广泛的、…

国内船载B级(CSTDMA)AIS设备使用问题简析

2019-06-30 01:45王晏海朱小平 航海订阅 2019年3期 收藏 王晏海 朱小平 国内船载B级&#xff08;CSTDMA&#xff09;AIS设备使用问题简析_参考网 摘 要&#xff1a;国内船载B级AIS大多采用载波侦听时分多址&#xff08;CSTDMA&#xff09;技术&#xff0c;目前仍存在部分船…

已解决raise JSONDecodeError(“Expecting value”, s, err.value) from None

已解决raise JSONDecodeError(“Expecting value”, s, err.value) from None json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 文章目录报错代码报错翻译报错原因解决方法帮忙解决报错代码 粉丝群一个小伙伴想用Python读取json报错&#xff0c;但是…

分布式基础篇1——环境搭建

一、项目简介1、电商模式2、项目前置知识3、项目技术&特色4、项目架构图5、微服务划分图二、分布式基础概念1、微服务2、集群&分布式&节点3、远程调用4、负载均衡5、服务注册/发现&注册中心6、配置中心7、服务熔断和服务降级8、API网关三、环境搭建1、使用 Vag…

PGL 系列(三)词向量 Skip-gram

环境 python 3.6.8paddlepaddle-gpu 2.3.0numpy 1.19.5一、Skip-gram概念 Skip-gram:根据中心词推理上下文 在Skip-gram中,先在句子中选定一个中心词,并把其他词作为这个中心词的上下文。如 上图 Skip-gram所示,把“spiked”作为中心词,把“Pineapples、are、and、yellow”…

万亿数字化市场,数据科学为何能扛起“价值担当”?

数据科学家&#xff0c;被誉是“21世纪最性感的职业”。 如今&#xff0c;一股数据科学的热潮正席卷国内各大高校。今年十月底&#xff0c;一系列数据科学的网络直播课在多所大学火爆异常&#xff0c;吸引来自北大、清华、北师大、哈工大、浙大等多所高校学生广泛参与。 该系…

低碳正在成为春城的新名片

导读&#xff1a;分布式光伏&#xff0c;昆明树立了新标杆。 提到昆明&#xff0c;很多人的第一印象是“春城”。“天气常如二三月&#xff0c;花枝不断四时春”&#xff0c;从古至今&#xff0c;人们毫不吝啬对这座宜居城市的赞誉。在绿色能源时代&#xff0c;昆明也有得天独厚…

进程间通信--共享内存篇

文章目录共享内存的概念共享内存使用须知创建共享内存共享内存的映射与链接共享内存的映射取消共享内存的删除共享内存实现进程通信总结共享内存的概念 共享内存字面理解就是进程间共同享有的存储空间&#xff0c;不同于管道通信&#xff0c;共享内存就像是进程自己的空间一样…

磷脂PEG化靶向蛋白肽系列 DSPE-PEG- RGR(CRGRRST)/ TH/ R8/ NGR 为华生物提供

品牌&#xff1a;为华生物 产地&#xff1a;广州 中文名称:磷脂-聚乙二醇-肿瘤靶向蛋白 肿瘤靶向蛋白-聚乙二醇-磷脂 英文名称: DSPE-PEG- RGR&#xff08;CRGRRST&#xff09; PEG分子量400、600、1k、2k、3.4k、5k、10k其他分子量可定制 分子量&#xff1a;根据客户需求定制…

002.爬楼梯

1.题目链接&#xff1a; 70. 爬楼梯 2.解题思路&#xff1a; 2.1.题目要求&#xff1a; 给个阶数 n&#xff0c;要求返回爬完 n 阶有几种方法。 一次可以爬 1 步 或者 2 步。 示例 1 输入&#xff1a;n 1 输出&#xff1a;1 解释&#xff1a;有一种方法可以爬到楼顶。 1.…