一.构建SimpleGIS
本文将使用python构建一个名为SimpleGIS的应用,这个程序将使用地理数据模型构建一个完整的GIS应用,而且可以渲染专题地图,显示不同城市的人口数量。
数据模型是结构化的,可以进行一些基本的查询操作。SimpleGIS包含科罗拉多州的3个城市及其人口数量。最重要的的是,我们将完全使用python代码实现这个小型系统的构建,其中会用到python标准库中的部分模块,但不会下载任何第三方应用包。
二.代码内容
代码大致分为两个部分。第一部分是数据模型部分,第二部分是地图数据渲染。
对于数据模型部分,将使用python的列表实现。python的列表是一种原生的数据类型,它可以按照特定顺序作为存储其他对象的容器。
第二部分将会使用python的turtle图形引擎渲染地图。我们在GIS系统中唯一用到的是世界坐标系转换函数,其作用是将经纬度转换为屏幕坐标格式。所有的图形引擎都有一个原点(0,0),这个点通常在绘图板的左上角或右下角。turtle的主要作用是讲授可视化编程的。turtle的图形画板的原点选在了中心点,类似一个图形计算器。
三.代码部分
#导入turtle模块
import turtle as t
#城市属性
NAME=0
POINTS=1
POP=2
#科罗拉多城市名、坐标和人口的列表
state=["COLORADO",[[-109,37],[-109,41],[-102,41],[-102,37]],5187582]
#初始化一个空的列表
cities=[]
#添加城市信息
cities.append(["DENVER",[-104.98,39.74],634265])
cities.append(["BOULDER",[-105.27,40.02],98889])
cities.append(["DURANGO",[-107.88,37,28],17069])
#地图尺寸
map_width=600
map_height=400
#确定最大范围
minx=180
maxx=-180
miny=90
maxy=-90
for x,y in state[POINTS]:
if x
elif x>maxx:maxx=x
if 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()和t.down()控制画笔
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)
#标记城市
t.write(city[NAME]+",POP.:"+str(city[POP]),align="left")
t.up()
#计算得出人口最多的城市
biggest_city=max(cities,key=lambda city:city[POP])
#在地图下方标记结果
t.goto(0,-300)
t.write("The biggest city is:"+ biggest_city[NAME])
#计算离西部最远的城市
#western_city = min(cities,key=lambda city:city[POINTS])
#to.goto(0,-320)
#t.write("The western-most city is:"+ western_city[NAME])
#隐藏画笔光标
t.pen(shown=False)
t.done()