头歌数据可视化第7关:时间空间数据的可视化——GIS可视化

任务描述

本关任务:完成 GIS 可视化内容。

相关知识

GIS 简介

GIS 全称 Geographic Information System或 Geo-Information system,中文名为:地理信息系统。它是一种特定的十分重要的空间信息系统。它是在计算机硬、软件系统支持下,对整个或部分地球表层(包括大气层)空间中的有关地理分布数据进行采集、储存、管理、运算、分析、显示和描述的技术系统。

位置与地理信息既是 LBS 的核心,也是 LBS 的基础。一个单纯的经纬度坐标只有置于特定的地理信息中,代表为某个地点、标志、方位后,才会被用户认识和理解。用户在通过相关技术获取到位置信息之后,还需要了解所处的地理环境,查询和分析环境信息,从而为用户活动提供信息支持与服务。

通俗来说就是纪录一堆数字的地理信息,使用有合适的软件去把它表示出来。

数据介绍

数据如下(是从基维百科以及国家统计局上整理的,地理位置可能存在细微的偏差)。将数据保存在文件 major_city。

Shanghai 24870895  31.23N  121.47E  China
Mumbai   12478447  18.96N  72.82E   India
Karachi  13050000  24.86N  67.01E   Pakistan
Delhi    16314838  28.67N  77.21E   India
Manila   11855975  14.62N  120.97E  Philippines
Seoul    23616000  37.56N  126.99E  Korea(South)
Jakarta  28019545   6.18S  106.83E  Indonesia
Tokyo    35682460  35.67N  139.77E  Japan
Beijing  21893095  39.91N  116.39E  China
Changsha 10047914  27.51N  111.53E  China
Moscow   11503501  55.5N   37.4E    Russia

第一列是城市名,第二列是人口,第三列和第四列分别为纬度和经度,最后一列为城市所在国家。

GIS 可视化

在数据可视化过程中,我们常常需要将数据根据其采集的地理位置在地图上显示出来。比如说我们会想要在地图上画出城市,飞机的航线,乃至于军事基地等等。通常来说,一个地理信息系统都会带有这样的功能。今天我们讨论如何在 Python 上实现,并且使用免费的工具包。

matplotlib 是 Python 常用的数据绘制包。它基于 numpy 的数组运算功能。matplotlib 绘图功能强大,可以轻易的画出各种统计图形,比如散点图,条行图,饼图等。matplotlib 常与 numpy 和 scipy 相配合,用于许多研究领域。他们是免费工具,但其功能足可以与科研界的大佬Matlab竞争。

Basemap 是 Matplotlib 的一个子包,负责地图绘制。在数据可视化过程中,我们常需要将数据在地图上画出来。比如说我们在地图上画出城市人口,飞机航线,军事基地,矿藏分布等等。这样的地理绘图有助于读者理解空间相关的信息。

我们下面用 Basemap 画出东半球部分城市的人口。如下图,人口的数量用圆圈的大小表示:

图一 东半球部分城市图 

程序分为两个部分,第一部分为从文件读取数据并处理。第二部分才是真正用 basemap 绘图。

第一部分:

names = []
pops = []
lats = []
lons = []
countries = []
with open('major_city') as f:
    text = f.read().split('\n')
for line in text:
    info = line.split()
    names.append(info[0])
    pops.append(float(info[1]))
    lat = float(info[2][:-1])
    if info[2][-1] == 'S': lat = -lat
    lats.append(lat)
    lon = float(info[3][:-1])
    if info[3][-1] == 'W': lon = -lon + 360.0
    lons.append(lon)
    country = info[4]
    countries.append(country) 

第二部分:

# 设置投影模式,初始经纬度
map = Basemap(projection='ortho', lat_0=35, lon_0=120)
# 画海岸线,国家边界,设置边界线条的粗细
map.drawcoastlines(linewidth=0.25)
map.drawcountries(linewidth=0.25)
# 绘制地图投影区域的边缘(海洋的颜色)  
map.drawmapboundary(fill_color='#689CD2')
# 每 30 度画出经纬线。
map.drawmeridians(np.arange(0, 360, 30))    
map.drawparallels(np.arange(-90, 90, 30))
# 绘制颜色,陆地使用 #BF9E30 (黄色),湖泊使用 #689CD2 (蓝色),zorder 为设置层级,本次是置于最低层
map.fillcontinents(color='#BF9E30 ', lake_color='#689CD2', zorder=0)
# 计算出地图投影坐标的纬度/经线网格
x, y = map(lons, lats)
max_pop = max(pops)
# 尺寸比例
size_factor = 80.0
# 字体显示角度
rotation = 30
for i, j, k, name in zip(x, y, pops, names):
    # 按比例计算人口显示的散点大小
    size = size_factor * k / max_pop
    cs = map.scatter(i, j, s=size, marker='o', color='#FF5600')
    plt.text(i, j, name, rotation=rotation, fontsize=10)
plt.title('Some cities in the eastern hemisphere & Population')

 地图的大小、投影方法等重要信息,是在 Basemap() 的调用中实现的:

map = Basemap(projection='ortho',lat_0=35,lon_0=120,resolution='l')

projection 参数规定了投影方法。改变投影方法,绘图结果也将非常不同。

城市所在位置是经纬度。我们想要把经纬度对应图像的像素点,需要转换:

x, y = map(lons, lats)

这个语句转换为图像上的位置。

最后,调用绘制散点图的方法 scatter():

cs = map.scatter(i,j,s=size,marker='o',color='#FF5600')

在地图上画出数据。

编程要求

根据提示,在右侧编辑器补充代码,读取地理信息,绘制地球并画出按要求信息点。 

测试说明

平台会对你编写的代码进行测试。

import matplotlib as mpl
# linux终端下没有GUI,进行设置
mpl.use('Agg')
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np

names = []
pops = []
lats = []
lons = []
countries = []
with open('step7/major_city') as f:
    text = f.read().split('\n')

for line in text:
    info = line.split()
    names.append(info[0])
    pops.append(float(info[1]))
    lat = float(info[2][:-1])
    if info[2][-1] == 'S': lat = -lat
    lats.append(lat)
    lon = float(info[3][:-1])
    if info[3][-1] == 'W': lon = -lon + 360.0
    lons.append(lon)
    country = info[4]
    countries.append(country)


# ============================================
########## Begin ##########
# 设置投影模式,初始经纬度, 纬度为 10,经度为 100
map = Basemap(projection='ortho', lat_0=10, lon_0=100)

########## End ##########

# 画海岸线,国家边界,设置边界线条的粗细
map.drawcoastlines(linewidth=0.25)
map.drawcountries(linewidth=0.25)

########## Begin ##########
# 海洋湖泊颜色为 #0099CC,陆地颜色为 #663300,经纬线间隔 10 度

# 绘制地图投影区域的边缘(海洋的颜色)
map.drawmapboundary(fill_color='#0099CC')

# 画出经纬线
map.drawmeridians(np.arange(0,360,10))
map.drawparallels(np.arange(-90,90,10))

# 绘制颜色,zorder 为设置层级,本次是置于最低层
map.fillcontinents(color='#663300', lake_color='#0099CC', zorder=0)
########## End ##########

# 计算出地图投影坐标的纬度/经线网格
x, y = map(lons, lats)
max_pop = max(pops)

# 尺寸比例
size_factor = 80.0

# 字体显示角度
rotation = 30
for i, j, k, name in zip(x, y, pops, names):
    # 按比例计算人口显示的散点大小
    size = size_factor * k / max_pop
    ########## Begin ##########
    # 根据人口绘制地区散点图,颜色设置为 #FF5600
    cs = map.scatter(i, j, s=size,marker='o',color='#FF5600')

    ########## End ##########
    plt.text(i, j, name, rotation=rotation, fontsize=10)
plt.title('Some cities in the eastern hemisphere & Population')
plt.savefig('step7/image1/test.png')
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 数据是指利用图表、图形等形式,将数据进行图形展示和解读的过程。而GIS(Geographic Information System,地理信息系统)则是利用计算机技术来存储、分析、管理和展示地理空间信息的系统。 在数据中,GIS地图分析可以提供更直观和准确的空间数据展示和分析。通过将数据与地图相结合,可以更清晰地展示地理空间的分布、系和变趋势,帮助人们更好地理解和解读数据。 CSDN作为中国最大的IT技术社区,提供了大量的数据GIS地图分析相的文章和教程。在CSDN上,你可以找到许多数据GIS地图分析的技术、方法和案例的文章和资料。通过学习这些内容,你可以了解数据GIS地图分析的基本概念和原理,掌握相的工具和技术,提高自己在这方面的能力。 在实际应用中,数据GIS地图分析在各个领域都有广泛的应用。在城市规划中,可以通过可和地图分析来评估交通拥堵情况、资源分布等问题;在环境保护中,可以利用数据和地图分析来监测污染源、分析环境变等;在商业分析中,可以通过地理空间的可和分析来评估市场潜力、进行竞争对手分析等。 总之,数据GIS地图分析是当今信息时代重要的技术手段,CSDN作为IT技术社区提供了丰富的相资源,帮助人们学习和应用这些技术,促进技术的创新和发展。 ### 回答2: 数据是一种通过图表、图像、地图等方式将数据呈现出来的方法。地理信息系统(GIS)是一种将地理数据与其他信息相结合的技术,可以对地理数据进行分析、管理和展示。CSDN是一个专业的IT社区,提供了大量于计算机科学和技术的在线资源和互动交流。 在数据方面,GIS地图分析在CSND上具有重要意义。首先,通过GIS地图分析,我们可以将大量的地理数据呈现在地图上,使得这些数据更加直观和易于理解。例如,我们可以将销售数据与地理位置相结合,在地图上展示出销售热点区域和销售额分布。这样的可分析可以帮助企业更好地了解市场需求和消费行为,从而做出更为准确和科学的决策。 其次,GIS地图分析可以帮助我们发现地理空间上的规律和趋势。通过对地理数据的统计和分析,我们可以得出一些重要的结论和认识,例如人口分布、土地利用、交通网络等。这些结论和认识可以帮助我们更好地规划城市、保护环境和改善生活质量。在CSND上分享和交流这些GIS地图分析的成果,可以促进更多人了解和参与城市规划和环境保护等工作。 此外,GIS地图分析还可以与其他数据分析方法相结合,例如统计分析、机器学习等。通过将不同类型的数据进行融合和分析,我们可以得到更加全面和深入的认识。在CSND上,我们可以发布GIS地图分析和其他数据分析方法相结合的案例和经验,推动学术界和业界之间的交流和合作。 总之,数据GIS地图分析在CSND上具有重要的意义,可以帮助我们更好地理解和利用地理数据,促进城市规划和环境保护等工作的发展。同时,通过在CSND上分享和交流这方面的经验和成果,可以促进学术界和业界之间的合作和创新。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值