靜態空間資料以 GeoDataFrame (Geopandas) 格式叫出來

資料都是從政府官方開放資料網站下載。
經過統整成 wgs1984 (epsg:4326) 之後,再轉乘 geojson --> pbf --> 以 gz 格式儲存在專案中。
轉成 geojson 主要是爲了將 shp 檔們存到 1個檔案中。 轉成 pbf 是因爲 geojson 佔空間; topojson 似乎在 python 不容易處理。
這工具主要是從專案中的 pbf.gz 檔案讀進去,轉成 gpd.GeoDataFrame 再回傳出來。

將 tgod 工具環境 叫進來

In [1]:
import tgod

畫圖工具,主要是示範用

In [5]:
import matplotlib.pyplot as plt
%matplotlib inline

目前整理好的空間靜態資料主要有行政界(縣市、鄉鎮、村裏、二級統計區、一級統計區(分縣市)、最小統計區(分縣市)),
以及一些交通運輸相關資料(國道、省道、臺鐵鐵路及車站、臺北及高雄捷運鐵路及車站、高鐵鐵路及車站、機場、碼頭、)

用以下兩個指令可以看得到有哪些資料的 key 。這些 key 是後面用來呼叫的 鑰匙。
(r=True 會將資料回傳, 預設爲 False,會直接列印出來,不回傳)

In [2]:
print tgod.get_map.get_boundary_key(r=True)
#tgod.get_map.get_boundary_key()
['county', 'township', 'village', 'bsu2', 'bsu1_changhua', 'bsu1_chiayishi', 'bsu1_chiayixian', 'bsu1_hsinchushi', 'bsu1_hsinchuxian', 'bsu1_hualian', 'bsu1_kaohsiung', 'bsu1_keelung', 'bsu1_kinmen', 'bsu1_lianchiang', 'bsu1_miaoli', 'bsu1_nantou', 'bsu1_newtaipei', 'bsu1_penghu', 'bsu1_pingtung', 'bsu1_taichung', 'bsu1_tainan', 'bsu1_taipei', 'bsu1_taitung', 'bsu1_taoyuan', 'bsu1_yilan', 'bsu1_yunlin', 'bsu0_changhua', 'bsu0_chiayishi', 'bsu0_chiayixian', 'bsu0_hsinchushi', 'bsu0_hsinchuxian', 'bsu0_hualian', 'bsu0_kaohsiung', 'bsu0_keelung', 'bsu0_kinmen', 'bsu0_lianchiang', 'bsu0_miaoli', 'bsu0_nantou', 'bsu0_newtaipei', 'bsu0_penghu', 'bsu0_pingtung', 'bsu0_taichung', 'bsu0_tainan', 'bsu0_taipei', 'bsu0_taitung', 'bsu0_taoyuan', 'bsu0_yilan', 'bsu0_yunlin']
In [3]:
print tgod.get_map.get_transportation_key(r=True)
#tgod.get_map.get_transportation_key()
['airport', 'dock', 'highspeedrail_station', 'highspeedrail_way', 'highway_1', 'highway_2', 'mrt_station', 'mrt_way', 'rail_station', 'rail_way']

舉個行政界的例子,呈現如何叫出 GeoDataFrame

In [8]:
gdf = tgod.get_map.get_boundary('county')
print gdf.head()
           area countyid countyname  \
0  3.021043e+07    09007        連江縣   
1  1.533424e+08    09020        金門縣   
2  2.187868e+09    10002        宜蘭縣   
3  1.411293e+09    10004        新竹縣   
4  1.826677e+09    10005        苗栗縣   

                                            geometry  
0  (POLYGON ((119.964448 25.946828, 119.964473 25...  
1  (POLYGON ((118.336252 24.386256, 118.336223 24...  
2  POLYGON ((121.960041 24.988445, 121.960593 24....  
3  POLYGON ((121.039529 24.944219, 121.040193 24....  
4  POLYGON ((120.911974 24.732447, 120.912062 24....  

GeoPandas 的 DataFrame 可以直接畫出來 當然也可以透過其 geometry 欄位的資料,用 shapely 的處理, 以 matplotlib 呈現。

In [9]:
#fig,ax = plt.subplots()
gdf.plot()
Out[9]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f9895b3add0>

再舉個國道的例子

In [10]:
gdf = tgod.get_map.get_transportation('highway_1')
print gdf.head()
  bridgeid dir      fnode                                           geometry  \
0      NaN   1  S8PK8PJVM  LINESTRING (121.359928 25.065177, 121.359259 2...   
1      NaN   0  S7MASNURS  LINESTRING (121.012141 24.861117, 121.012129 2...   
2      NaN   0  S7LXBNUE2  LINESTRING (121.00851 24.857724, 121.008568 24...   
3      NaN   1  S7PBLNWFC  LINESTRING (121.032669 24.876589, 121.032103 2...   
4      NaN   0  S8CVLPC8T  LINESTRING (121.251452 25.003921, 121.251667 2...   

       oldroadid rdname roadaliasn roadcode roadcomnum         roadid  \
0  6500000026375    NaN      林口交流道     0010          0  6500000026375   
1  1000400013999    NaN      湖口服務區     0010          0  1000400013999   
2  1000400023623    NaN      湖口服務區     0010          0  1000400023623   
3  1000400014360    NaN      湖口交流道     0010          0  1000400014360   
4  1000300050896    NaN      中壢服務區     0010          0  6800000050896   

  roadname roadstruct roadtype      tnode tunnelid updatedate width  
0       國1          5       HU  S8PBNPJV8      NaN     110829     6  
1       國1          1       HU  S7M9TNUNT      NaN     110829     6  
2       國1          1       HU  S7LXHNUD5      NaN     110829     6  
3       國1          5       HU  S7P2DNWEV      NaN     110829     6  
4       國1          1       HU  S8CWAPC6P      NaN     110829     6  

畫出來長這樣

In [11]:
fig,ax = plt.subplots()
ax.set_aspect('equal')
for i in range(len(gdf)):
    ls = gdf.iloc[i]['geometry']
    x,y = ls.xy
    ax.plot(x,y)
In [ ]: