pythongeo
⑴ 在python3.5下怎麼安裝geoplotlib,seaborn,pygal,bokeh
Bokeh是一個專門針對Web瀏覽器的呈現功能的互動式可視化Python庫。這是Bokeh與其它可視化庫最核心的區別。
說明了Bokeh如何將數據展示到一個Web瀏覽器上的流程。
⑵ 有人用python開發GIS用戶程序么
例子取自<<Learning Geospatial Analysis with Python>>
代碼由兩部分組成。第一部分是數據模型,第二部分是繪制數據(地圖渲染)。
一、數據模型:使用python內置的列表(list),用來存儲空間數據。
[python]view plain
#DATAMODEL
#Alllayerswillhaveaname,1+points,andpopulationcount
NAME=0
POINTS=1
POP=2
#Createthestatelayer
state=["COLORADO",[[-109,37],[-109,41],[-102,41],[-102,37]],5187582]
#Citieslayerlist
#city=[name,[point],population]
cities=[]
#AddDenver
cities.append(["DENVER",[-104.98,39.74],634265])
#AddBoulder
cities.append(["BOULDER",[-105.27,40.02],98889])
#AddDurango
cities.append(["DURANGO",[-107.88,37.28],17069])
#MAPGRAPHICSRENDERING
map_width=800
map_height=500
#StateBoundingBox
#UsePythonmin/maxfunctiontogetboundingbox
minx=180
maxx=-180
miny=90
maxy=-90
forx,yinstate[POINTS]:
ifx<minx:minx=x
elifx>maxx:maxx=x
ify<miny:miny=y
elify>maxy:maxy=y
#Getearthdistanceoneachaxis
dist_x=maxx-minx
dist_y=maxy-miny
#Scalingratioeachaxis
#tomappointsfromworldtoscreen
x_ratio=map_width/dist_x
y_ratio=map_height/dist_y
#Functiontoconvertlat/lontoscreencoordinates
defconvert(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]
#Drawthestate
t.up()
first_pixel=None
forpointinstate[POINTS]:
pixel=convert(point)
printpixel
ifnotfirst_pixel:
first_pixel=pixel
t.goto(pixel)
t.down()
#Gobacktothefirstpoint
t.goto(first_pixel)
#Labelthestate
t.up()
t.goto([0,0])
t.write(state[NAME],align="center",font=("Arial",16,"bold"))
#Drawthecities
forcityincities:
pixel=convert(city[POINTS])
t.up()
t.goto(pixel)
#Placeapointforthecity
t.dot(10)
#Labelthecity
t.write(city[NAME]+",Pop.:"+str(city[POP]),align="left")
t.up()
#Performanattributequery
#Question:?
#Writetheresultbutmakesureit'sunderthemap
biggest_city=max(cities,key=lambdacity:city[POP])
t.goto(0,-1*((map_height/2)+20))
t.write("Thebiggestcityis:"+biggest_city[NAME])
#Performaspatialquery
#Question:Whichisthewesternmostcity?
#Writetheresultbutmakesureit'sundertheotherquestion
western_city=min(cities,key=lambdacity:city[POINTS])
t.goto(0,-1*((map_height/2)+40))
t.write("Thewestern-mostcityis:"+western_city[NAME])
#Hideourmappen
t.pen(shown=False)
t.done()
二、地圖渲染
使用python Turtle 繪圖模塊來渲染地圖。其中有一個函數用來將世界坐標轉換為像素坐標。
1、首先計算地圖的顯示範圍及設定屏幕的繪制范圍
[python]view plain
2、世界坐標到屏幕坐標的轉換
[python]view plain
3、繪制地圖:標注和要素圖形
[python]view plain
三、結果
⑶ python geohash怎麼安裝
打開命令提示符
鍵入【pip install geohash】(只輸入【】內的內容)
回車
記得要聯網操作
⑷ 使用Python實時將gps返回的經緯度轉化為圖片
主要就是做了兩件事情:
1.生成一張有文本信息的JPG圖片
2.寫入EXIF信息
生成照片需要PIL和libjpeg
import Imageimport ImageDrawimport ImageFontdef create_pic(path, text=[], type='jpeg'):
img = Image.new("RGB", (2448, 3264), '#37b6ce')#顏色和大小
draw = ImageDraw.Draw(img)
font = ImageFont.truetype('ziti.ttf', 120)#ttf是字體,120是字型大小
for h in range(0, len(text)):#多行文本
draw.text((256, 256 + 120 * h), text[h], font=font)
img.save(path, type)#保存
# img.show()
讀寫EXIF信息需要pyexiv2,獲取google的經緯度需要geopy
順便說下經緯度的表示:
一般exif里看到的都是這樣的57°55'56.6",是度,分,秒這么展示的,google上獲取來的是十進制的57.9323888888888
所以需要轉換一下再寫進去
公式:57°55'56.6" =57+55/60+56.6/3600=57.9323888888888
etemplate=pyexiv2.ImageMetadata('IMG_4408.JPG')template.read()#exif信息很多,所以找個真正手機拍攝的照片當模版googlev3=geopy.GoogleV3()place,gps=googlev3.geocode(location)#獲取gps信息,location寫地名,比如『北京王府井』,偶爾會被牆,最好掛個代理defset_exif(path,date_time=None,gps=()):
"""
datetime=2014:10:0412:41:38
geo=(lat=39.12315,lng=115.12231)
"""
metadata=pyexiv2.ImageMetadata(path)
metadata.read()
forkintemplate.exif_keys:
metadata[k]=pyexiv2.ExifTag(k,template[k].value)
ifnotdate_time:
date_str=pyexiv2.utils.exif(date_time)
metadata['Exif.Photo.DateTimeOriginal']=date_str
metadata['Exif.Photo.DateTimeDigitized']=date_str
metadata['Exif.Image.DateTime']=date_str
iflen(geo)>0:
c_lat=decimal2coordinate(geo[0],['S','N'])
c_lng=decimal2coordinate(geo[1],['W','E'])
metadata["Exif.GPSInfo.GPSLatitude"]=coordinate2rational(c_lat[0],c_lat[1],c_lat[2])
metadata["Exif.GPSInfo.GPSLatitudeRef"]=c_lat[3]
metadata["Exif.GPSInfo.GPSLongitude"]=coordinate2rational(c_lng[0],c_lng[1],c_lng[2])
metadata["Exif.GPSInfo.GPSLongitudeRef"]=c_lng[3]
else:
metadata._delete_exif_tag("Exif.GPSInfo.GPSLatitude")
metadata._delete_exif_tag("Exif.GPSInfo.GPSLatitudeRef")
metadata._delete_exif_tag("Exif.GPSInfo.GPSLongitude")
metadata._delete_exif_tag("Exif.GPSInfo.GPSLongitudeRef")
metadata.write()defdecimal2coordinate(value,loc):
"""
loc=lat=>["S","N"],lng=>["W","E"]
retrunD,M,S,locate
"""
ifvalue<0:
loc_value=loc[0]
elifvalue>0:
loc_value=loc[1]
else:
loc_value=""
abs_value=abs(value)
deg=int(abs_value)
t1=(abs_value-deg)*60
min=int(t1)
sec=round((t1-min)*60,5)
return(deg,min,sec,loc_value)defcoordinate2rational(D,M,S):
return(fractions.Fraction(D,1),fractions.Fraction(int((M+S/60)*100),100),fractions.Fraction(0,1))
⑸ 如何用Python繪制JS地圖
Folium是建立在Python生態系統的數據整理(Datawrangling)能力和Leaflet.js庫的映射能力之上的開源庫。用Python處理數據,然後用Folium將它在Leaflet地圖上進行可視化。
概念
Folium能夠將通過Python處理後的數據輕松地在互動式的Leaflet地圖上進行可視化展示。它不單單可以在地圖上展示數據的分布圖,還可以使用Vincent/Vega在地圖上加以標記。
這個開源庫中有許多來自OpenStreetMap、MapQuest Open、MapQuestOpen
Aerial、Mapbox和Stamen的內建地圖元件,而且支持使用Mapbox或Cloudmade的API密鑰來定製個性化的地圖元件。
Folium支持GeoJSON和TopoJSON兩種文件格式的疊加,也可以將數據連接到這兩種文件格式的疊加層,最後可使用color-brewer
配色方案創建分布圖。
安裝
安裝folium包
開始創建地圖
創建底圖,傳入起始坐標到Folium地圖中:
importfolium
map_osm= folium.Map(location=[45.5236, -122.6750]) #輸入坐標
map_osm.create_map(path='osm.html')
Folium默認使用OpenStreetMap元件,但是Stamen Terrain, Stamen Toner, Mapbox Bright 和MapboxControl空間元件是內置的:
#輸入位置,tiles,縮放比例
stamen =folium.Map(location=[45.5236, -122.6750], tiles='Stamen Toner',zoom_start=13)
stamen.create_map(path='stamen_toner.html')#保存圖片
Folium也支持Cloudmade 和 Mapbox的個性化定製地圖元件,只需簡單地傳入API_key :
custom =folium.Map(location=[45.5236, -122.6750], tiles='Mapbox',
API_key='wrobstory.map-12345678')
最後,Folium支持傳入任何與Leaflet.js兼容的個性化地圖元件:
tileset= r'http://{s}.tiles.yourtiles.com/{z}/{x}/{y}.png'
map =folium.Map(location=[45.372, -121.6972], zoom_start=12,
tiles=tileset, attr='My DataAttribution')
地圖標記
Folium支持多種標記類型的繪制,下面從一個簡單的Leaflet類型的位置標記彈出文本開始:
map_1 =folium.Map(location=[45.372, -121.6972], zoom_start=12,
tiles='Stamen Terrain')
map_1.simple_marker([45.3288,-121.6625], popup='Mt. Hood Meadows')#文字標記
map_1.simple_marker([45.3311,-121.7113], popup='Timberline Lodge')
map_1.create_map(path='mthood.html')
Folium支持多種顏色和標記圖標類型:
map_1 =folium.Map(location=[45.372, -121.6972], zoom_start=12,tiles='Stamen Terrain')
map_1.simple_marker([45.3288,-121.6625], popup='Mt. Hood Meadows',marker_icon='cloud') #標記圖標類型為雲
map_1.simple_marker([45.3311,-121.7113], popup='Timberline Lodge',marker_color='green') #標記顏色為綠色
map_1.simple_marker([45.3300,-121.6823], popup='Some OtherLocation',marker_color='red',marker_icon='info-sign')
#標記顏色為紅色,標記圖標為「info-sign」)
map_1.create_map(path='iconTest.html')
Folium也支持使用個性化的尺寸和顏色進行圓形標記:
map_2 =folium.Map(location=[45.5236, -122.6750], tiles='Stamen Toner',
zoom_start=13)
map_2.simple_marker(location=[45.5244,-122.6699], popup='The Waterfront')
簡單樹葉類型標記
map_2.circle_marker(location=[45.5215,-122.6261], radius=500,
popup='Laurelhurst Park',line_color='#3186cc',
fill_color='#3186cc')#圓形標記
map_2.create_map(path='portland.html')
Folium有一個簡便的功能可以使經/緯度懸浮於地圖上:
map_3 =folium.Map(location=[46.1991, -122.1889], tiles='Stamen Terrain',zoom_start=13)
map_3.lat_lng_popover()
map_3.create_map(path='sthelens.html')
Click-for-marker功能允許標記動態放置:
map_4 =folium.Map(location=[46.8527, -121.7649], tiles='Stamen Terrain',zoom_start=13)
map_4.simple_marker(location=[46.8354,-121.7325], popup='Camp Muir')
map_4.click_for_marker(popup='Waypoint')
map_4.create_map(path='mtrainier.html')
Folium也支持來自Leaflet-DVF的Polygon(多邊形)標記集:
map_5 =folium.Map(location=[45.5236, -122.6750], zoom_start=13)
map_5.polygon_marker(location=[45.5012,-122.6655], popup='Ross Island Bridge',fill_color='#132b5e', num_sides=3,radius=10)#三邊形標記
map_5.polygon_marker(location=[45.5132,-122.6708], popup='Hawthorne Bridge',fill_color='#45647d', num_sides=4,radius=10)#四邊形標記
map_5.polygon_marker(location=[45.5275,-122.6692], popup='Steel Bridge',fill_color='#769d96', num_sides=6, radius=10)#四邊形標記
map_5.polygon_marker(location=[45.5318,-122.6745], popup='Broadway Bridge',fill_color='#769d96', num_sides=8,radius=10) #八邊形標記
map_5.create_map(path='bridges.html')
Vincent/Vega標記
Folium能夠使用vincent 進行任何類型標記,並懸浮在地圖上。
buoy_map= folium.Map(location=[46.3014, -123.7390], zoom_start=7,
tiles='StamenTerrain')
buoy_map.polygon_marker(location=[47.3489,-124.708], fill_color='#43d9de',radius=12, popup=(vis1, 'vis1.json'))
buoy_map.polygon_marker(location=[44.639,-124.5339], fill_color='#43d9de',radius=12, popup=(vis2, 'vis2.json'))
buoy_map.polygon_marker(location=[46.216,-124.1280], fill_color='#43d9de',radius=12, popup=(vis3, 'vis3.json'))
GeoJSON/TopoJSON層疊加
GeoJSON 和TopoJSON層都可以導入到地圖,不同的層可以在同一張地圖上可視化出來:
geo_path= r'data/antarctic_ice_edge.json'
topo_path= r'data/antarctic_ice_shelf_topo.json'
ice_map= folium.Map(location=[-59.1759, -11.6016],tiles='Mapbox Bright', zoom_start=2)
ice_map.geo_json(geo_path=geo_path)#導入geoJson層
ice_map.geo_json(geo_path=topo_path,topojson='objects.antarctic_ice_shelf')#導入Toposon層
ice_map.create_map(path='ice_map.html')
分布圖
Folium允許PandasDataFrames/Series類型和Geo/TopoJSON類型之間數據轉換。Color Brewer 顏色方案也是內建在這個庫,可以直接導入快速可視化不同的組合:
importfolium
importpandas as pd
state_geo= r'data/us-states.json'#地理位置文件
state_unemployment= r'data/US_Unemployment_Oct2012.csv'#美國失業率文件
state_data= pd.read_csv(state_unemployment)
#LetFolium determine the scale
map =folium.Map(location=[48, -102], zoom_start=3)
map.geo_json(geo_path=state_geo,data=state_data,
columns=['State', 'Unemployment'],
key_on='feature.id',
fill_color='YlGn',fill_opacity=0.7, line_opacity=0.2,
legend_name='Unemployment Rate(%)')
map.create_map(path='us_states.html')
基於D3閾值尺度,Folium在右上方創建圖例,通過分位數創建最佳猜測值,導入設定的閾值很簡單:
map.geo_json(geo_path=state_geo,data=state_data,
columns=['State', 'Unemployment'],
threshold_scale=[5, 6, 7, 8, 9,10],
key_on='feature.id',
fill_color='BuPu',fill_opacity=0.7, line_opacity=0.5,
legend_name='Unemployment Rate(%)',
reset=True)
map.create_map(path='us_states.html')
⑹ 如何生成geojson格式的tiles
轉載自 需下載的工具有:python:python-2.6
Python Setup tools :setuptools-0.6c11.win32-py2.6
GDAL:GDAL-1.9.2.win32-py2.6
TileStache:TileStache-1.42.1
1.首先安裝python2.6 並配置環境變數
2.安裝Setup tools (方面安裝其他軟體)和GDAL
3.使用Setup tools安裝TileStache, ModestMaps, PIL(TileStache 依賴於這兩項)
easy_install tilestache
easy_install PIL
easy_install ModestMaps
4.在下載的TileStache中的文件夾中配置cfg文件
{
"cache":
{
"name": "Disk",
"path": "/tmp/stache",
"umask": "0000"
},
"layers":
{
"postgis":
{
"provider": {"name": "vector", "driver": "Postgresql",
"parameters": {"dbname": "postgis", "user": "postgres","password":"postgres",
"table": "mainroad"}}
}
}
}
}
5.然後用tilestache-seed進行切片
6.結果
後面會推出矢量切片在OL中的應用。OpenLayers中載入矢量切片,可有效解決大數據量的問題
⑺ centos 系統下python 導入GeoIP錯誤,可是我已經安裝了GeoIP了 ImportError: No mole named GeoIP
如果你是想要獲取經緯度等信息,試試安裝這個模塊
pip install python-geoip-geolite2
⑻ php 有沒有類似python中geohash.expand的函數
geohash是擴展庫吧
⑼ python調用百度地圖這個怎麼搞
不是所有的地址都能得得一個有效的地理編碼的,需要檢查status是否為0。
參考以下代碼:
#coding=utf-8
fromurllib.requestimporturlopen,quote
fromjsonimportloadsasloadjson
ak='--------------------------------'
def_url(service,**kv):
qstr=''
url='http://api.map..com/'
+service+'/v2/'
+'?output=json'
+'&ak='+ak
fork,vinkv.items():
url+='&'+k+'='+quote(v)
returnurl
defmapapi(service,**kv):
data=urlopen(_url(service,**kv)).read().decode('utf-8')
returnloadjson(data)
geo=mapapi('geocoder',address='gd')
ifgeo['status']==0:
try:
print(geo['result']['location']['lng'])
except(Exception,):
print(geo)
else:
print('{}({})'.format(geo['msg']if'msg'ingeo.keys()elsegeo['message'],
geo['status']))
⑽ 有哪些 GIS+Python 的開發經驗值得分享
GIS 和 python 的結合有很多種可能性
Arcpy 參考ArcPy and ArcGIS (豆瓣), pyQGIS 參考PyQGIS Developer Cookbook
Geopython GIS相關庫
GDAL 參考 Welcome to the Python GDAL/OGR Cookbook!
各種空間資料庫,如 spatialite 參考 SpatiaLite Cookbook
基礎庫(抽象庫)
GDAL 不多說,GIS萬物本源
Proj.4 制圖學投影轉換庫
geojson geojson數據處理,點線面
高級庫
Shapley GIS的圖像處理
Fiona GIS數據讀入寫出
Rtree Rtree空間索引
pyproj Proj.4的介面擴展
OWSLib WMS地圖服務發放
basemap 畫地圖
超高級庫
geopandas 整合了pandas,shapely,fiona,descartes,pyproj和rtrees可以直接用於數據處理
geodjango django出品,保護GDAL,GEOS等可以發送地圖服務
參考 Python 筆記三:Geopython GIS相關庫
而如今,javascript在互聯網的地位也變得越來越重要,GIS+JS的項目也氤氳而生,所以問題來了。參考:有哪些GIS+JavaScript(node.js)的開發經驗值得分享? - Node.js
或者關注我的博客,寫得不是很好,希望各路大神多多留言指導。
Awesome GIS(GIS Tech Stack技術棧)
Geomatics專欄點此:Geomatics(GIS,GPS,RS,Surveying)
語言
Python 最好的快速開發語言,是一門API藝術
awesome-python
1簡單的入門
2總結入門坑及基礎資源
3Geopython GIS相關庫
4Python的常用庫入門
5Flask框架
6入門爬蟲坑--網頁數據壓縮(python deflate gzip)
7Requests爬蟲技巧
Node.js 最炙手可熱的網路技術源泉,可用於WebGIS
awesome-javascript
1常用Global庫
2入門及GeoNode.js GIS相關庫
前段
Leaflet 兼容移動端,和現代的一些框架一樣優先考慮移動端
1leaflet入門
2簡單插件編寫leaflet-pip-v2
3進階插件編寫geojsonFilter
Mapbox總有人討論「Mapbox VS Leaflet?」這是個爛問題,Mapbox是Leaflet的超集,就像Typescript和Javascript之間的關系一樣
Openlayer3扯淡大叔教程
Turf js層面做出簡單的空間分析
後端
Geoserver 基於Java的地理信息服務的發布,使用簡單
Mapserver 基於C語言的地理信息服務的發布,內存佔用小
GDAL 數據格式轉換
1GDAL命令行入門
2python for GDAL
3gdal CLI Cheat Sheet
數據格式
GeoJSON 開源地理信息JSON格式
awesome-geojson
geojson-js-utils 空間數據簡單處理js實現
geojson-python-utils空間數據簡單處理python實現
TopoJSON 開源地理信息JSON格式,大小要比GeoJSON小40%
TileJSON 瓦片數據包裝的JSON格式,用的不多
WKT&WKB 文本標記語言表示矢量數據
WKT&WKB 筆記一:格式介紹
資料庫
Spatialite 空間數據的查詢等處理,小項目足矣
1簡單的入門
2CLI Cheat Sheet
3python for Spatialite
4NET平台使用spatilite擴展
5Spatiliate2GeoJson數據的轉換
Postgresql 大型空間數據項目
MBTILES 承載瓦片的數據,快速索引
1入門與簡單應用
瓦片渲染
Global Mapper 專門用作已有柵格圖像切片
Mapnik 專門用於矢量數據的切片
TileMill 在矢量數據渲染時,運用CartoCSS對矢量數據賦予樣式
數據處理
QGIS 開源GIS數據處理桌面軟體,其中包含Grass,SAGA兩個學術界開源GIS平台
1簡單的介紹
2地圖綜合
Mapsharper 數據綜合神器
1地圖綜合神器
數據資料
地理空間數據雲 沒想到數據來的這么快
填坑
1網頁端JS的緩存問題
2Angular遇到的一些坑
3SpatialiteSharp的使用坑
整個技術棧主要針對的是輕量或者小項目去考慮,運用一些流行的盡可能開源的工具去做,這是我的一些想法和筆記,詳情參考從mapbox的開源工具看Web GIS的發展,希望能給您一點點幫助。PS:我在github上看到一個awesome gis,並非我主導的,希望各位GISer可以一起參與修改。
轉載,請表明出處。總目錄Awesome GIS