Monday, October 17, 2011

台北市政府公開資料(二)- 按地理位址搜尋資料

多數的搜尋技術,在處理地理位址時,只處理地點的資料,例如餐廳、百貨公司等小地理區塊等,但是這些地點搜詢技術,並不適合用在處理大區塊範圍的資料,如行政區及學區等。

如多數外國網站用的坐標轉行政區的GeoNames,他在搜尋某個座標目前所屬的行政區時,是計算座標點與附近行政區中心的距離來猜測,但是行政區往往不是正圓型的,行政區的劃分多是依自然環境(如河川)來切割的,所以,既始某個座標離行政區甲較近,但是,在實務上則是被劃分到乙行政區去的;類似的例子還有學區等

另一類無法用點去描述 的,是線型的資料,如登山步道、腳踏車道,當我們登山時,我們不一定要從起點開始爬,而是可以從中間點開始加入,因此,當我們在找附近所有的登山步道時,該是計算所有線型資料與目前座標點的最短距離,而非是算起點與目前座標點的距離。

依據了這套需求,我在我公司的產品上增加了對地理區塊搜尋的功能,讓用戶能對點(Point)、線(LineString),多邊型(Polygon)等資料,做搜尋。

底下的連結,是搜詢台北101大樓所在的行政區,大家可以玩玩看


{"results": [{"id": 302,"properties": {"AREA": 522872.00372,"NEW": 6300200001,"FULL": "臺北市信義區西村里","PERF_ID": 63002,"COUN_ID": "6300200","CPID": "63002","CPTID": "6300200","CPTVID": "6300200001","NPID": 63002,"NPTID": 6300200,"NPTVID": 6300200001,"PNAME": "臺北市","TNAME": "信義區","VNAME": "西村里","PTVNAME": "臺北市信義區西村里","PTNAME": "臺北市信義區","TVNAME": "信義區西村里","TM2_MAX_X": 306528.415,"TM2_MAX_Y": 2770435.21,"TM2_MIN_X": 305428.311,"TM2_MIN_Y": 2769739.57,"MAX_X": 0,"MAX_Y": 0,"MIN_X": 0,"MIN_Y": 0}}],"metadata": {"searchQuery": {"queries": [],"constraints": [{"@type": "location","field": "geometry","location": "25.033611,121.565","radius": 1}],"pagination": {"start": 0,"count": 1}},"start": 0,"count": 1,"total": 1}}

Thursday, October 6, 2011

轉換台北市政府公開資料的格式

在台北市政府公開的資料中,有一大部份是用shapefile的格式開放的,如何把這些資料轉換出來,變成是一個問題,在這邊把我怎麼把TWD67座標的shapefile,轉換成WSG84的 GeoJSON格式。

首先,請參考前文把里介圖在QGIS中打開。

再來按這邊講的,把TWD67的定義加入到 QGIS 中

接著,選Layer Property -> Set Layer CRS -> TWD 67

然後,指定專案用的CRS定意,FIle -> Project Property -> CRS -> WSG 84

最後,是把Layer另存新檔,Layer -> Save As -> File Format: GeoJSON, Encoding: UTF-8

這樣,就可以把shapefile的內容匯出來,變成像下述的格式

{ "type": "Feature", "id": 0, "properties": { "AREA": 16326625.055040, "NEW": 6301200042.000000, "FULL": "臺北市北投區湖田里", "PERF_ID": 63012.000000, "COUN_ID": "6301200", "CPID": "63012", "CPTID": "6301200", "CPTVID": "6301200042", "NPID": 63012.000000, "NPTID": 6301200.000000, "NPTVID": 6301200042.000000, "PNAME": "臺北市", "TNAME": "北投區", "VNAME": "湖田里", "PTVNAME": "臺北市北投區湖田里", "PTNAME": "臺北市北投區", "TVNAME": "北投區湖田里", "TM2_MAX_X": 306973.245000, "TM2_MAX_Y": 2789383.300000, "TM2_MIN_X": 301490.096000, "TM2_MIN_Y": 2783263.350000, "MAX_X": 0.000000, "MAX_Y": 0.000000, "MIN_X": 0.000000, "MIN_Y": 0.000000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 121.522589, 25.174993 ], [ 121.522587, 25.174995 ], [ 121.522557, 25.175033 ], [ 121.522408, 25.175170 ], [ 121.522317, 25.175324 ], [ 121.522314, 25.175367 ], [ 121.522323, 25.175569 ], [ 121.522315, 25.175789 ], [ 121.522322, 25.175950 ], [ 121.522270, 25.176082 ], [ 121.522158, 25.176302 ], [ 121.522043, 25.176548 ], [ 121.522002, 25.176598 ], [ 121.521997, 25.176648 ], [ 121.522278, 25.177273 ], [ 121.522359, 25.177825 ], [ 121.522384, 25.178200 ], [ 121.522338, 25.178332 ], [ 121.522127, 25.178615 ], [ 121.521821, 25.178986 ], [ 121.521780, 25.179026 ], [ 121.521691, 25.179134 ], [ 121.522349, 25.179671 ], [ 121.522623, 25.179892 ], [ 121.522810, 25.179997 ], [ 121.522949, 25.180089 ], [ 121.523101, 25.180244 ], [ 121.523337, 25.180539 ], [ 121.523425, 25.180655 ], [ 121.523550, 25.180683 ], [ 121.523641, 25.180779 ], [ 121.523652, 25.180779 ], [ 121.523816, 25.1809