赞
踩
简介:本文以Python地理空间分析指南(第2版)第一章为基本,对于书中出现的概念只是简要的说明,大家如果不懂可以自行补充,此文主要以程序分析为基本,用到的python版本为3.9。此节对于程序SimpleGIS为重点,进行了全面的刨析,以及所需要的turtle库进行的简单讲解。
本书第一章介绍了GIS与遥感方面基本概念,如地信与遥感的概念、矢量数据栅格数据的介绍,对于地信人员来说是基础。如果你还不是对地信与遥感这方面特别熟练,推荐着重学习一些相关软件如Arcgis与ENVI,实践学习相结合更好的帮助自己理解并学习掌握这方面内容,为接下来学习做准备。
对于简单的Python没有太多概述,建议大家可以自学,能够使用列表、字典、类、函数即可;本章设计的库为turtle库,用到的代码如下:
turtle.up()——抬起画笔(在移动过程中不会画线)
turtle.down()——画笔落下(将抬起的画笔放下,使能在屏幕绘制线条)
turtle.goto(x,y)——移动画笔至(x,y)点
turtle.write()——写入文本
turtle.dot()——画点(在屏幕上标记出点)
turtle.done()——持续打开图画
turtle.pen(shown=False)——隐藏光标
其他turtle库以及各种参数请参考turtle --- 海龟绘图 — Python 3.10.8 文档
导入turtle,并赋值变量。
- import turtle as t
- NAME=0
- POINTS=1
- POP=2
建立一个包含科罗拉多州城市、坐标、人口的列表。
state=["科多里达",[[-109,37],[-109,41],[-102,41],[-102,37]],5187582]
创建一个城市空列表,将3个城市信息(包含名字、坐标、人口)分别建立三个列表并添加到城市列表中。
- cities=[]
- cities.append(['DENVER',[-104.98,39.71],634265])
- cities.append(['BOULDER',[-105.27,40.02],98889])
- cities.append(['DURANGO',[-107.88,37.28],17069])
采用赋值变量的形式定义地图尺寸。
- map_width=400
- map_height=300
确保州尺寸在地图中,如果不在将自动调整。
- minx=180
- maxx=-180
- miny=90
- maxy=-90
- for x,y in state[POINTS]:
- if x<minx:
- minx=x
- elif x>maxx:
- maxx=x
- if y <miny:
- miny=y
- elif y>maxy:
- maxy=y
计算州和绘图版的缩放比例
- dist_x=maxx-minx
- dist_y=maxy-miny
- x_ratio=map_width/dist_x
- y_ratio=map_height/dist_y
定义convert函数,使用缩放比例将经纬度转换为平面坐标,类似于转换投影坐标系。
- def convert(point):
- lon=point[0]
- lat=point[1]
- x=map_width-((maxx-lon)*x_ratio)
- y=map_height-((maxy-lat)*y_ratio)
- x=x-(map_width/2)
- y=y-(map_height/2)
- return [x,y]
打印州的区域
- t.up()
- first_pixel=None
- for point in state[POINTS]:
- pixel=convert(point)
- if not first_pixel:
- first_pixel=pixel
- t.goto(pixel)
- t.down()
- t.goto(first_pixel)
- t.up()
- t.goto([0,0])
- t.write(state[NAME],align='center',font=('Arial',16,'bold'))
绘制城市各个城市
- for city in cities:
- pixel=convert(city[POINTS])
- t.up()
- t.goto(pixel)
绘制城市位置
t.dot(10,'red')
标记城市
- t.write(f'城市:{city[NAME]}人口:{city[POP]}',align='left')
- t.up()
查询人口最多的城市
- biggest_city=max(cities,key=lambda city:city[POP])
- t.goto(0,-200)
- t.write(f'人口最多的城市是{biggest_city[NAME]}')
查询离西部最远的城市
- western_city=min(cities,key=lambda city:city[POINTS])
- t.goto(0,-220)
- t.write(f'最靠近西的为{western_city[NAME]}')
隐藏光标并持续打开
- t.pen(shown=False)
- t.done()
'''导入turtle'''
import turtle as t
NAME=0
POINTS=1
POP=2
'''一个包含科罗拉多州城市、坐标、人口的列表'''
state=["科多里达",[[-109,37],[-109,41],[-102,41],[-102,37]],5187582]
'''城市信息'''
cities=[]
cities.append(['DENVER',[-104.98,39.71],634265])
cities.append(['BOULDER',[-105.27,40.02],98889])
cities.append(['DURANGO',[-107.88,37.28],17069])
'''定义地图尺寸'''
map_width=400
map_height=300
'''确保州尺寸在地图中,如果不在自动调整'''
minx=180
maxx=-180
miny=90
maxy=-90
for x,y in state[POINTS]:
if x<minx:
minx=x
elif x>maxx:
maxx=x
if y <miny:
miny=y
elif y>maxy:
maxy=y
'''计算州和绘图版的缩放比例'''
dist_x=maxx-minx
dist_y=maxy-miny
x_ratio=map_width/dist_x
y_ratio=map_height/dist_y
'''convert函数,使用缩放比例将经纬度转换为XY坐标'''
def convert(point):
lon=point[0]
lat=point[1]
x=map_width-((maxx-lon)*x_ratio)
y=map_height-((maxy-lat)*y_ratio)
x=x-(map_width/2)
y=y-(map_height/2)
return [x,y]
'''打印区域'''
t.up()
first_pixel=None
for point in state[POINTS]:
pixel=convert(point)
if not first_pixel:
first_pixel=pixel
t.goto(pixel)
t.down()
t.goto(first_pixel)
t.up()
t.goto([0,0])
t.write(state[NAME],align='center',font=('Arial',16,'bold'))
'''绘制城市'''
for city in cities:
pixel=convert(city[POINTS])
t.up()
t.goto(pixel)
# 绘制城市位置
t.dot(10,'red')
# 标记城市
t.write(f'城市:{city[NAME]}人口:{city[POP]}',align='left')
t.up()
# 查询人口最多
biggest_city=max(cities,key=lambda city:city[POP])
t.goto(0,-200)
t.write(f'人口最多的城市是{biggest_city[NAME]}')
# 哪个离西部最远
western_city=min(cities,key=lambda city:city[POINTS])
t.goto(0,-220)
t.write(f'最靠近西的为{western_city[NAME]}')
# 隐藏光标并持续打开
t.pen(shown=False)
t.done()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。