首页 > 其他分享 >赠-地图绘制

赠-地图绘制

时间:2023-06-06 21:55:05浏览次数:49  
标签:basemap 地图 map2 map1 90 绘制

basemap地图绘制

地图绘制也是数据可视化的一部分,常用的地图绘制库为basemap工具包,其为matplotlib的子包。本章将讲解如何利用whl文件在Python3环境下安装basemap;学会使用basemap绘制地图;学会缩放区域和绘制散点图;通过综合案例,巩固basemap的绘制地图方法和技巧。
本章主要涉及到的知识点有:

basemap安装:学会basemap的安装方法。
basemap使用:学会利用basemap绘制简单地图。
缩放区域与绘图:学会通过定位经纬度缩放区域与绘制散点图。
综合案例:通过综合案例,巩固basemap的绘制地图方法和技巧。

basemap的使用

basemap是一个强大的绘制地图工具包。本节将讲解如何安装和使用basemap,结合matplotlib,绘制地图。

basemap安装

在anaconda的python3环境中,通过conda命令安装basemap会导致失败,这里通过该网站(https://www.lfd.uci.edu/~gohlke/pythonlibs/)
下载对应版本的Pyproj和basemap的whl文件,如图12.1和12.2所示。
image
图12.1 Pyproj下载

image
图12.2 basemap下载

在anaconda环境中,切换到这两个whl文件的路径下,按顺序通过pip依次安装Pyproj和basemap文件,代码如下,安装Pyproj,如图12.3所示,代表Pyproj安装成功。

h:
cd H:\python数据分析\数据
pip install pyproj-1.9.5.1-cp36-cp36m-win_amd64.whl

image
图12.3 Pyproj安装

以同样的方法安装basemap,代码如下,如图12.4所示,安装basemap。

h:
cd H:\python数据分析\数据
pip install basemap-1.1.0-cp36-cp36m-win_amd64.whl

image
图12.4 basemap安装

如图12.5所示,通过from mpl_toolkits.basemap import Basemap代码调用该库,发现程序可以运行,代表basemap库安装成功。
image
图12.5 安装成功

basemap使用

首先,导入需要的第三方库,通过basemap初始化一个地图对象,通过drawcoastlines绘制海岸线,代码如下。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
%matplotlib inline

map1 = Basemap(projection='ortho', lat_0=90, lon_0=-105,
              resolution='l', area_thresh=1000.0)      #初始化地图对象
map1.drawcoastlines()      #绘制海岸线

projection参数是用于定义地图的投影方式;lat_0和lon_0是指定地图的中心坐标,这里的值为美国的中心坐标;resolution参数设置绘制边界的精度,l为低精度;area_thresh参数为阈值,低于该阈值的就不会被绘制。绘制地图如图12.6所示。注意:更多参数详情可参考http://matplotlib.org/basemap/。
image
图12.6 基本地图
通过drawcountries方法绘制国家边界,代码如下,如图12.7所示。

map1 = Basemap(projection='ortho', lat_0=90, lon_0=-105,
              resolution='l', area_thresh=1000.0) 
map1.drawcoastlines()  #绘制海岸线
map1.drawcountries()   #绘制国家

image
图12.7 绘制国家

其他常见的绘制方法如下:

drawmapboundary()   #绘制边界
drawstates()          #绘制州
drawcounties()        #绘制县
通过fillcontinents方法为大陆填充颜色,代码如下,如图12.8所示。
map1 = Basemap(projection='ortho', lat_0=90, lon_0=-105,
              resolution='l', area_thresh=1000.0) 
map1.drawcoastlines()  #绘制海岸线
map1.drawcountries()   #绘制国家
map1.fillcontinents(color='blue',alpha=0.5)  #填充颜色

image
图12.8 填充大陆颜色
通过drawmeridians和drawparallels方法绘制经线和纬线,代码如下,如图12.9所示。

map1 = Basemap(projection='ortho', lat_0=90, lon_0=-105,
              resolution='l', area_thresh=1000.0) 
map1.drawcoastlines()  #绘制海岸线
map1.drawcountries()   #绘制国家
map1.drawmapboundary() #绘制边界
map1.fillcontinents(color='blue',alpha=0.5)  #填充颜色

map1.drawmeridians(np.arange(0, 360, 30))    #绘制经线
map1.drawparallels(np.arange(-90, 90, 30))   #绘制纬线

image
图12.9 绘制经度和纬度
更换projection参数,换为robin坐标,可将图绘制为平面坐标,代码如下,如图12.10所示。

map1 = Basemap(projection='robin', lat_0=90, lon_0=-105,
              resolution='l', area_thresh=1000.0) 
map1.drawcoastlines()  #绘制海岸线
map1.drawcountries()   #绘制国家
map1.drawmapboundary() #绘制边界
map1.fillcontinents(color='blue',alpha=0.5)  #填充颜色

map1.drawmeridians(np.arange(0, 360, 30))    #绘制经线
map1.drawparallels(np.arange(-90, 90, 30))   #绘制纬线

image
图12.10 平面坐标

缩放区域与绘图

在实际案例中,需对特定国家或地区进行绘制地图,这样就需要通过llcrnrlon、llcrnrlat、urcrnrlon和urcrnrlat指定左下角经纬度和右上角经纬度,代码如下,如图12.11所示。

map2 = Basemap(projection='stere', lat_0=90, lon_0=-105,
               llcrnrlon=-118.67, llcrnrlat=23.41,
               urcrnrlon=-64.5, urcrnrlat=45.44,
              resolution='l', area_thresh=1000.0) 
map2.drawcoastlines()  #绘制海岸线
map2.drawcountries()   #绘制国家
map2.drawmapboundary() #绘制边界
map2.drawstates()      #绘制州
map2.fillcontinents(color='blue',alpha=0.5)  #填充颜色

map2.drawmeridians(np.arange(0, 360, 30))    #绘制经线
map2.drawparallels(np.arange(-90, 90, 30))   #绘制纬线

image
图12.11 缩放区域
通过坐标定位,可以在地图上绘制图形,代码如下,如图12.12所示。

map2 = Basemap(projection='stere', lat_0=90, lon_0=-105,
               llcrnrlon=-118.67, llcrnrlat=23.41,
               urcrnrlon=-64.5, urcrnrlat=45.44,
              resolution='l', area_thresh=1000.0) 
map2.drawcoastlines()  #绘制海岸线
map2.drawcountries()   #绘制国家
map2.drawmapboundary() #绘制边界
map2.drawstates()      #绘制州
map2.drawmeridians(np.arange(0, 360, 30))    #绘制经线
map2.drawparallels(np.arange(-90, 90, 30))   #绘制纬线

lon = -74
lat = 40.43
x,y = map2(lon, lat)       #映射坐标
map2.plot(x, y, 'ro', markersize=8)  #绘制散点图

image

图12.12 绘制散点图
通过matplotlib库的text方法,为散点加入文本注释。

map2 = Basemap(projection='stere', lat_0=90, lon_0=-105,
               llcrnrlon=-118.67, llcrnrlat=23.41,
               urcrnrlon=-64.5, urcrnrlat=45.44,
              resolution='l', area_thresh=1000.0) 
map2.drawcoastlines()  #绘制海岸线
map2.drawcountries()   #绘制国家
map2.drawmapboundary() #绘制边界
map2.drawstates()      #绘制州

map2.drawmeridians(np.arange(0, 360, 30))    #绘制经线
map2.drawparallels(np.arange(-90, 90, 30))   #绘制纬线

lon = -74
lat = 40.43
x,y = map2(lon, lat)       #映射坐标
map2.plot(x, y, 'ro', markersize=8)  #绘制散点图
plt.text(x,y,'New York')   #文本注释

image
图12.13 文本注释

basemap综合示例

本节将讲解如何通过basemap绘制区域与全球地图,结合具体案例,讲解地图的绘制方法和技巧。

美国人口分布

通过该网站(https://github.com/plotly/datasets/blob/master/2014_us_cities.csv)
下载2014年美国城市的人口数据,读取数据,如图12.14所示,数据总共有四个字段,城市名称、城市人口和经纬度坐标。
image

图12.14 美国人口数据
通过以下代码,绘制前180个城市的美国人口分布图,如图12.15所示。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
%matplotlib inline

plt.style.use('ggplot')
plt.figure(figsize=(10,6))

map3 = Basemap(projection='stere', lat_0=90, lon_0=-105,
               llcrnrlon=-118.67, llcrnrlat=23.41,
               urcrnrlon=-64.5, urcrnrlat=45.44,
              resolution='l', area_thresh=1000.0) 
map3.drawcoastlines()  #绘制海岸线
map3.drawcountries()   #绘制国家
map3.drawmapboundary() #绘制边界
map3.drawstates()      #绘制州
map3.drawcounties()      # 绘制县

map3.drawmeridians(np.arange(0, 360, 30))    #绘制经线
map3.drawparallels(np.arange(-90, 90, 30))   #绘制纬线

lat = np.array(pop_data["lat"][0:180])                        # 获取维度之维度值
lon = np.array(pop_data["lon"][0:180])                        # 获取经度值
pop = np.array(pop_data["pop"][0:180],dtype=float)    # 获取人口数,转化为numpy浮点型
size = (pop/np.max(pop))*1000 # 计算每个点的大小

x,y = map3(lon,lat)
map3.scatter(x,y,s=size)

plt.title('Population distribution in America')     #加标题

代码分析:
(1)1~5行
导入程序需要的库。
(2)7~8行
设置图表的样式为ggplot,并设置图表的长宽比。
(3)10~21行
定义basemap对象,并绘制出美国的地图底图和经纬度。
(4)23~29
获取前180个数据,并绘制散点图。
image
图12.15 美国人口分布图
注意:人口如果不转化为numpy浮点型,散点图不会显示出大小不一。

全球地震可视化

通过美国地震局官网(https://earthquake.usgs.gov/earthquakes/feed/v1.0/csv.php)
下载过去一周的地震数据,如图12.16所示。
image
图12.16 过去一周地震数据下载
读取数据,如图12.17所示,该数据有很多字段,但本次分析中用到的就是经纬度字段和mag字段(震级)。
image
图12.17 地震数据
对这三个字段查看缺失值,如图12.18所示,mag字段有1个缺失值。
image
图12.18 查看缺失值
通过过滤剔除到这个缺失值,如图12.19所示。
image
图12.19 过滤缺失值
通过以下代码,绘制地震分布图,如图12.20所示。

image
图12.20 全球地震分布图(1)
根据震级大小,绘制散点不一的地震分布图,如图12.21所示。

plt.style.use('ggplot')
plt.figure(figsize=(10,6))

map5 = Basemap(projection='robin', lat_0=39.9, lon_0=116.3,
               resolution = 'l', area_thresh = 1000.0) 

map5.drawcoastlines()
map5.drawcountries()
map5.drawmapboundary()

map5.drawmeridians(np.arange(0, 360, 30))
map5.drawparallels(np.arange(-90, 90, 30))

size = 2    #初始化大小
for lon, lat, mag in zip(list(eq_data['longitude']), list(eq_data['latitude']), list(eq_data['mag'])):
    x,y = map5(lon, lat)
    msize = mag * size     #不同震级大小不一样
    map5.plot(x, y, 'ro', markersize=msize)

image
图12.21 全球地震分布图(2)
通过以下代码,定义一个函数,可通过不同震级绘制颜色不同的地图,如图12.22所示。

def get_marker_color(mag):
    if mag < 3.0:
        return ('go')
    elif mag < 5.0:
        return ('yo')
    else:
        return ('ro')      #定义设置颜色函数

plt.style.use('ggplot')
plt.figure(figsize=(10,6))

map6 = Basemap(projection='robin', lat_0=39.9, lon_0=116.3,
               resolution = 'l', area_thresh = 1000.0) 

map6.drawcoastlines()
map6.drawcountries()
map6.drawmapboundary()

map6.drawmeridians(np.arange(0, 360, 30))
map6.drawparallels(np.arange(-90, 90, 30))

size = 2
for lon, lat, mag in zip(list(eq_data['longitude']), list(eq_data['latitude']), list(eq_data['mag'])):
    x,y = map6(lon, lat)
    msize = mag * size
    map6.plot(x, y, get_marker_color(mag), markersize=msize)   #调用函数

plt.title('Earthquakes')

image
图12.22 全球地震分布图(3)

pyecharts地图绘制

pyecharts也可以轻松绘制出美观可交互的地图。本节将讲解如何利用pyecharts绘制不同地区的地图,通过Geo方法在地图上绘制散点图。

地图

利用pyecharts绘制地图,需要下载地图js文件,通过pip进行安装,如图12.23所示。

pip install echarts-countries-pypkg        #全球国家地图
pip install echarts-china-provinces-pypkg  #中国省级地图
pip install echarts-china-cities-pypkg      #中国市级地图

image
图12.23 安装地图js
注意:安装好后记得重启jupyter notebook。
利用Map方法可绘制地图,代码如下。

value = [155, 78, 23, 65]
label = ["北京", "上海", "西藏", "广东"]
map1 = pyecharts.Map("全国地图示例")
map1.add("",label, value, maptype='china')
map1.render()   #生成html文件
该add方法的参数如下,maptype设置地图类型,支持china、world、中国省市名称等;is_roam可缩放地图;is_map_symbol_show显示地图红点。
add(name, attr, value,
    maptype='china',
    is_roam=True,
    is_map_symbol_show=True, **kwargs)

绘制的中国地图如图12.24所示。
image
图12.24 全国地图(1)
设置is_label_show=True,可以显示各省份名称,代码如下,如图12.25所示。

value = [155, 78, 23, 65]
label = ["北京", "上海", "西藏", "广东"]
map1 = pyecharts.Map("全国地图示例", width=1200, height=600)
map1.add("",label, value, maptype='china', is_label_show=True)
map1.render()   #生成html文件

image
图12.25 全国地图(2)
结合Visualmap可以美化地图,根据值显示不同颜色,代码如下,如图12.26所示。

value = [155, 78, 23, 65]
label = ["北京", "上海", "西藏", "广东"]
map1 = pyecharts.Map("全国地图示例", width=1200, height=600)
map1.add("",label, value, maptype='china', is_visualmap=True,
        visual_text_color='#000')
map1.render()   #生成html文件

image
图12.26 全国地图(3)
修改maptype参数可以绘制省级地图,代码如下,如图12.27所示。

value = [233, 102, 41, 82]
attr = ['武汉市', '咸宁市', '黄冈市', '黄石市']
map1 = pyecharts.Map("湖北省地图")
map1.add("", attr, value, maptype='湖北', is_visualmap=True,
        visual_text_color='#000')
map1.render()

image
图12.27 湖北省地图
修改maptype参数为world可以绘制世界地图,代码如下,如图12.28所示。

value = [46, 54, 45, 82, 45]
attr= ["China", "Canada", "Brazil", "Russia", "United States"]
map1 = pyecharts.Map("世界地图", width=1200, height=600)
map1.add("", attr, value, maptype="world", is_visualmap=True,
        visual_text_color='#000', is_map_symbol_show=False)
map1.render()

image
图12.28 全球地图

地图坐标系

地图坐标系组件用于地图的绘制,支持在地图上绘制散点图,线集。利用Geo方法可在地图上绘制散点图等,代码如下。

data = [
    ('上海', 78),('武汉', 56),('长沙', 45),('北京', 65),('苏州', 32),('盐城', 15),
    ('南昌', 87),('青岛', 45),('广州', 78),('拉萨', 12),('桂林', 21),('西安', 42),
    ('济南', 12)]

geo = pyecharts.Geo("地图绘制案例一",
          title_pos="center", width=1200,
          height=600)
attr, value = geo.cast(data)
geo.add("", attr, value, visual_range=[0, 100], visual_text_color="#fff",
        geo_normal_color="#FFFFFF",
        symbol_size=15, is_visualmap=True)
geo.render()

该add方法的参数如下,type设置图例类型,'scatter', 'effectScatter', 'heatmap'可选;
symbol_size为散点图大小;
border_color设置地图边界颜色;
geo_normal_color为正常情况下地图区域颜色;
geo_emphasis_color为高亮下地图区域的颜色。

add(name, attr, value,
    type="scatter",
    maptype='china',
    symbol_size=12,
    border_color="#111",
    geo_normal_color="#323c48",
    geo_emphasis_color="#2a333d",
    is_roam=True, **kwargs)

绘制的地图如图12.29所示。
image
图12.29 案例一
修改type参数,更改为heatmap,代码如下,如图12.30所示。

data = [
    ('上海', 78),('武汉', 56),('长沙', 45),('北京', 65),('苏州', 32),('盐城', 15),
    ('南昌', 87),('青岛', 45),('广州', 78),('拉萨', 12),('桂林', 21),('西安', 42),
    ('济南', 12)]

geo = pyecharts.Geo("地图绘制案例二",
          title_pos="center", width=1200,
          height=600)
attr, value = geo.cast(data)
geo.add("", attr, value, type='heatmap', visual_range=[0, 100], visual_text_color="#fff",
        geo_normal_color="#FFFFFF",
        symbol_size=15, is_visualmap=True)
geo.render()

image
图12.30 案例二

标签:basemap,地图,map2,map1,90,绘制
From: https://www.cnblogs.com/cheng020406/p/17461722.html

相关文章

  • ArcGIS绘制研究区域图的方法
      本文介绍基于ArcMap软件,绘制论文中研究区域示意图、概况图等的方法。  最近需要绘制与地学有关论文、文献中的研究区域概况图。对于这一类图片,我个人比较喜欢基于ArcMap与PPT结合的方式来绘制,具体操作如下。  当然,首先这里要提一句:大家一定需要注意,绘制我国相关的地图时(......
  • maplibre-gl加载天地图影像
    要在MapLibreGL中加载天地图的影像底图,需要使用天地图的瓦片服务URL,并将其添加为栅格图层。以下是一个示例代码片段,展示如何在MapLibreGL中加载天地图的影像底图://创建地图实例varmap=newmaplibregl.Map({container:'map-container',//替换为你的地图容器的......
  • [原]Wpf应用Path路径绘制圆弧
    1. 移动指令:MoveCommand(M):M起始点 或者:m起始点比如:M100,240或m100,240使用大写M时,表示绝对值;使用小写m时;表示相对于前一点的值,如果前一点没有指定,则使用(0,0)。2. 绘制指令(DrawCommand):我们可以绘制以下形状:(1)直线:Line(L)(2)水平直线:Horizontalline(H)(3)垂......
  • 探究GIS地图在城市规划、环境管理和农业领域的应用
    在这个信息爆炸的时代,如何有效地理解和利用地理空间数据成为各行各业追求的目标。而GIS地图作为一种强大的工具,能够帮助我们连接世界的空间智慧。 GIS地图的魅力在于它能够将庞大的地理数据转化为直观、可视化的地图表达。通过GIS地图,我们可以将地理信息呈现为各种形式的图层,如......
  • 递归获取省市区的边界信息文件,用于echarts的map地图
    数据来源为阿里云,单个省市区信息可直接在这里面下载:http://datav.aliyun.com/portal/school/atlas/area_selector#&lat=30.332329214580188&lng=106.72278672066881&zoom=3.5由于需求需要点击省份里面的城市就展示新的城市的地图,所以需要把所有省市区的边界信息json全部下载下来......
  • 仙境传说RO:添加地图传送门教程
    仙境传说RO:添加地图传送门教程大家好我是艾西,上一篇文章中我跟大家分享了仙境传说RO怎么添加NPC,NPC可以加入自己想要售卖的装备物品等。那么对于玩家跑地图需要手动跑肯定是不方便的毕竟大家玩游戏就是为了娱乐以及放松,那么今天艾西教大家怎么在仙境传说服务端添加地图传送门。地图......
  • 类GeometricShapeFactory-JTS几何图形绘制API
    org.locationtech.jts.util类GeometricShapeFactoryjava.lang.Objectorg.locationtech.jts.util.GeometricShapeFactory直接已知子类:正弦之星工厂公共类GeometricShapeFactory扩展Object计算各种常见的几何形状。提供各种方法来指定所生成形状的位置,范围和旋转,以及用于形成它们......
  • threejs绘制多边形几何体
    threejs绘制多边形 //创建一个立方体几何体varcubeGeometry=newTHREE.BoxGeometry(0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5);//创建一个多边形几何体varpolygonGeometry=newTHREE.Geometry();//创建多边形的顶点数......
  • 银河麒麟V10 SP3下安装部署GeoServer地图服务
    一、环境JDK:Java1.8.0_361TomcT:ApacheTomcat/9.0.33GeoServer:geoserver-2.11.0二、安装部署1.确保在系统上安装了JavaRuntimeEnvironment(JRE)。GeoServer需要Java8或Java11环境,可从OpenJDK,AdoptOpenJDK获得或由您的OS发行版提供。[root@localhost~]#yuminstalljava-1.8......
  • 运用webkit绘制渲染页面原理解决iscroll4闪动的问题
    PostedbyunbugonSep19,2012inCSS3,MobileWebApp,OPOA|1comment已经有不少前端同行抱怨iScroll4的各种问题,我个人并不赞同将这些问题归咎于iScroll4,因为iScroll4进无论是touch事件的捕获,还是使用transform来处理滚动,以及将cubic-bezier应用到transition上实现高效......