1. 程式人生 > >一個用python編寫的GIS程式-simple GIS

一個用python編寫的GIS程式-simple GIS

例子取自<<Learning Geospatial Analysis with Python>>

程式碼由兩部分組成。第一部分是資料模型,第二部分是繪製資料(地圖渲染)。

一、資料模型:使用python內建的列表(list),用來儲存空間資料。

# DATA MODEL
# All layers will have a name, 1+ points, and population count
NAME = 0
POINTS = 1
POP = 2

# Create the state layer
state = ["COLORADO", [[-109, 37], [-109, 41], [-102, 41], [-102, 37]], 5187582]

# Cities layer list
# city = [name, [point], population]
cities = []

# Add Denver
cities.append(["DENVER",[-104.98, 39.74], 634265])
# Add Boulder
cities.append(["BOULDER",[-105.27, 40.02], 98889])
# Add Durango
cities.append(["DURANGO",[-107.88,37.28], 17069])
二、地圖渲染

使用python Turtle 繪圖模組來渲染地圖。其中有一個函式用來將世界座標轉換為畫素座標。

1、首先計算地圖的顯示範圍及設定螢幕的繪製範圍

# MAP GRAPHICS RENDERING
map_width = 800
map_height = 500

# State Bounding Box
# Use Python min/max function to get bounding box
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
# Get earth distance on each axis
dist_x = maxx - minx
dist_y = maxy - miny

# Scaling ratio each axis 
# to map points from world to screen
x_ratio = map_width / dist_x
y_ratio = map_height / dist_y
2、世界座標到螢幕座標的轉換
# Function to convert lat/lon to screen coordinates
def convert(point):
  lon = point[0]
  lat = point[1]
  x = map_width - ((maxx - lon) * x_ratio)
  y = map_height - ((maxy - lat) * y_ratio)
  # Python turtle graphics start in the middle of the screen
  # so we must offset the points so they are centered
  x = x - (map_width/2)
  y = y - (map_height/2)
  return [x,y]
3、繪製地圖:標註和要素圖形
# Draw the state
t.up()
first_pixel = None
for point in state[POINTS]:
  pixel = convert(point)
  print pixel
  if not first_pixel:
    first_pixel = pixel
  t.goto(pixel)
  t.down()
# Go back to the first point
t.goto(first_pixel)
# Label the state
t.up()
t.goto([0,0])
t.write(state[NAME], align="center", font=("Arial",16,"bold"))

# Draw the cities
for city in cities:
  pixel = convert(city[POINTS])
  t.up()
  t.goto(pixel)
  # Place a point for the city
  t.dot(10)
  # Label the city
  t.write(city[NAME] + ", Pop.: " + str(city[POP]), align="left")
  t.up()
  
# Perform an attribute query
# Question: Which city has the largest population?
# Write the result but make sure it's under the map
biggest_city = max(cities, key=lambda city:city[POP])
t.goto(0, -1*((map_height/2)+20))
t.write("The biggest city is: " +  biggest_city[NAME])

# Perform a spatial query
# Question: Which is the western most city?
# Write the result but make sure it's under the other question
western_city = min(cities, key=lambda city:city[POINTS])
t.goto(0, -1*((map_height/2)+40))
t.write("The western-most city is: " + western_city[NAME])
  
# Hide our map pen
t.pen(shown=False)
t.done()  

三、結果




相關推薦

一個python編寫GIS程式-simple GIS

例子取自<<Learning Geospatial Analysis with Python>> 程式碼由兩部分組成。第一部分是資料模型,第二部分是繪製資料(地圖渲染)。 一、資料模型:使用python內建的列表(list),用來儲存空間資料。 #

一個Python編寫的股票資料(滬深)爬蟲和選股策略測試框架

一個股票資料(滬深)爬蟲和選股策略測試框架,資料基於雅虎YQL和新浪財經。 根據選定的日期範圍抓取所有滬深兩市股票的行情資料。 根據指定的選股策略和指定的日期進行選股測試。 計算選股測試實際結果(包括與滬深300指數比較)。 儲存資料到JSON檔案、CS

python編寫一個屏保程式(背單詞)

大家好,我是一名即將畢業的大學生,第一次在CSDN上發表文章,之前在其他的部落格上也寫過,但是總的來說,這個平臺的資源要多一些(個人覺得),所以有很多不懂的地方希望大家多多指教。 今天我要給大家分享的是一款自己寫的屏保程式,大學嘛大家最頭疼的就是四六級的考試了,上次考試做閱讀的時候,情不

python編寫一個時時彩的開獎號碼採集器

前期準備 Python   功能需求 1.採集資料,支援斷線後重新登入時的資料自動補全 2.按日期存放到資料庫中 3.GUI介面顯示選定日期的資料以及最新開獎的資料重新整理 功能實現 標註:為避免衝突,在描述時,類屬性名和類方法名會修改成紅色,普

Python 編寫一個簡單的 CS 架構後門

0x00:事先說明 你已經攻陷了對方主機且獲得了最高許可權。 對方的本地防火牆會丟棄所有的外來資料包。 這個後門不會僅繫結在某一個埠上。 這段程式碼很容易寫,畢竟是 Python(準確說是 Python 2.x)。 0x01:工作原理

python編寫一個高效搜索代碼工具

pytho keyword path 入參 dir 實時 遍歷 exist 自己 用python編寫一個高效搜索代碼工具大多碼農在linux環境下使用grep+關鍵詞的命令搜索自己想要的代碼或者log文件。今天介紹用python如何編寫一個更強大的搜索工具,windows下

Python編寫執行Hello World程式

簡介         我們將看一下如何用Python編寫執行一個傳統的“Hello World”程式。通過它,你將學會如何編寫、儲存和執行Python程式。          有兩種使用Python執行你的程式的方式——使用互動式的帶提示符的直譯器或使用原始檔。我們將學習這兩

一個Python語言編寫的簡單的資料庫

如果我們想將資料簡單的儲存起來(建立一個簡單的資料庫),可以使用python語言的模組shelve來完成大部分工作。 shelve模組裡面應用最廣泛的函式是open,它將一個檔名作為引數,並返回一個shelf物件,供我們來儲存資料。就像操作普通字典那樣來操作它

python編寫ftp客戶端程式

#!/usr/bin/env python#author:Jims of www.ringkee.com#create date: 2005/02/05#description: Using ftplib module download a file from a ftp server.from ftplib

python編寫模擬戶登錄

es2017 顯示 列表 退出 count png comment 賬戶 tin readme:涉及python知識點 數據類型 用戶與程序交互 while循環 if..else判斷 大致流程圖: 基礎需求: 讓用戶輸入用戶名密碼 認證成功後顯示歡迎信息 輸錯

作業:python編寫戶名密碼輸入接口程序

pan 超過 div times += gpo print have int count = 0while count <3: username = input("username:") password = input("password:") ‘

iPhone X的新解鎖技術:Python編寫Face ID

base 嘗試 OS 實現 閾值 BE 自動 並不是 不同類 創建了無邊框手機後,蘋果不得不找出新方法簡單快捷地解鎖手機。雖然一些競爭對手繼續使用放在不同位置的指紋傳感器,但蘋果決定對解鎖手機的方式進行創新和變革:只需看一眼,FaceID就能安全地解鎖iPhone X。借助

Python編寫WordCount程序任務

氣象 文本文 con accept stdin hdfs 文本 width exce 1. 用Python編寫WordCount程序並提交任務 程序 WordCount 輸入 一個包含大量單詞的文本文件 輸出 文件中每個單詞及其出現次數(

Python編寫web爬蟲的5個方法

web 描述 結構化數據 方式 網絡 提取信息 src 添加 只讀 這些庫可以使你更容易構架個人項目。 在 Python/Django 的世界裏有這樣一個諺語:為語言而來,為社區而留。對絕大多數人來說的確是這樣的,但是,還有一件事情使得我們一直停留在 Pytho

Python編寫登錄接口

pri get [] font lock 註冊 class gis div 登陸接口要求: 輸入用戶名和密碼 認證成功後顯示歡迎信息 輸錯三次後鎖定 代碼: 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #

python編寫購物程序

ber [] int 啟動程序 hone 種類 col true cal 要求: 啟動程序後,讓用戶輸入工資,然後打印商品列表 允許用戶根據商品編號購買商品 用戶選擇商品後,檢測余額是否充足,夠就直接扣款,不夠就提醒 可隨時推出,退出時打印以購買商品,購買商品數量及余額

python編寫購物程序(2)

用戶 pri 退出 index goods lan class clas 購物車 要求: 啟動程序後,讓用戶輸入工資,然後打印商品列表 允許用戶根據商品編號購買商品 用戶選擇商品後,檢測余額是否充足,夠就直接扣款,不夠就提醒 可隨時推出,退出時打印以購買商品,購買商品數量

快速掌握python寫並行程式

目錄 一、大資料時代的現狀 二、面對挑戰的方法 2.1 平行計算 2.2 改用GPU處理計算密集型程式 3.3 分散式計算 三、用python寫並行程式 3.1 程序與執行緒 3.2 全域性直譯器鎖GIL: 3.3

Python編寫微信小遊戲“跳一跳”的執行指令碼

前言 更新了微信後發現了一款小遊戲跳一跳,但是玩了一下午最高才達到200,每次差點破紀錄後總是手抖就掛掉了,氣的想要砸手機。。閒來無事刷微博的時候正好看到有人分析如何編寫指令碼自動運行遊戲破了3000多分,細看後覺得原理並不複雜,就索性花了一個晚上,參考大神的實現方法,在他的基礎上刪減了一

Python編寫水仙花數

def sxh(start, end): if end >= start and start >=100 and end<= 999: num=start #將num的值初始化 L =[] while num<=end: