發表文章

目前顯示的是 6月, 2015的文章

[T-SQL] 如何得到台灣村里經緯度及畫出村里界線

圖片
因為負責公司的open data專案而開始常常想 open data的應用 也想用利用open data做一些自己的作品 一直想用地理資訊呈現一些資料視覺化的效果 最近發現原來政府有公開村里的地理資訊資料 實在是太棒了 覺得自己繳的稅有了回報 政府公開的是shp檔 於是又摸索了一下如何把shp轉成SQL Server的地理物件 發現台灣很少有人寫到這一塊 於是我又雞婆的先來跟鄉民報告一下我是怎麼做的吧 在這裡 http://data.gov.tw/node/7438下載地理資訊 或是搜尋 村里界圖 村里經緯度 就可以找到 下載完之後解壓縮 先放著 趕緊再去下載一個很重要的轉檔程式 http://www.sharpgis.net/page/sql-server-2008-spatial-tools 下載完以後一樣要解壓縮 會看到資料夾裡面有Shape2sql執行檔 按二下之後會跳出這個畫面請你設定要連線的資料庫 如果暫時不連就先按Cancel 然後會跳出以下這個畫面 這才是正經的 在Shapefile的地方選擇你剛剛下載好並解壓縮的村里地理資訊資料裡的 .shp 檔案 接著按下Configure輸入你要上傳的資料庫連線資訊 如上圖 然後按下 upload to Database 幸運的話 你就會看到上傳的進度 等到上傳完成會跳出通知的視窗 如果不幸運的話 你可能會像我一樣遇到 系統缺少sqlspatial.dll的錯誤訊息 這時候就要去下載額外的功能套件 叫做   " Microsoft SQL Server System CLR Types "  http://www.microsoft.com/zh-TW/download/details.aspx?id=29065 裝好 Microsoft SQL Server System CLR Types 之後 再重新打開 Shape2sql重新上傳一次 應該就成功囉 你可以到你的資料庫裡面看有沒有多出一個資料表 上傳成功的資料表畫面如下 到空間結果的地方可以看到村里的界線圖 最重要的是資料表裡面已經有了Geometry物件 可以隨心所欲的做其它的運算 例如我運用了STCentriod這個method算出每一個村里的中心點

[T-SQL] geography 資料類型的應用筆記

因為公司產業的關係,常常會需要算二點之間的距離 還沒發現geography這個資料型別之前都是直接算二點之間的直線距離,但是心裡知道其實不對,應該要用弧形距離去算才對 SQL的geography的資料型別可以儲存單點、線、多邊形的表示方式 而且有方法直接可以算出真正的距離(以地球弧形為準) 簡直是天要救我啊 點 INSERT INTO [dbo].[GeoTest] ([ID], [Geo]) VALUES (1, 'POINT (121.43, 25.02)') 這裡可以注意到是用POINT後面直接帶經緯度,寫入之後系統會自動轉成geography物件 線 INSERT INTO [dbo].[GeoTest] ([ID], [Geo]) VALUES (2, 'LINESTRING (121.34 25.10, 120.10 24.33)') 這裡是用LINESTRING後面帶2個點,中間用逗號分隔,所以會變成一直線,寫入之後系統也會自動轉成geography物件,可以在SQL的空間結果裡看到一條線 多邊形 INSERT INTO [dbo].[GeoTest] ([ID], [Geo]) VALUES (3, 'POLYGON (121.34 25.10, 120.10 24.33, 123.11 23.12, 127.55 24.12)') 這裡是用POLYGON後面帶4個點,所以會變成一個多邊形,一樣會自動轉成geography物件,可以在空間結果裡看到一個區塊,這是可以應用到區域的劃分 假設要算二點之間的距離,可以用STDistance這個方法算出來,系統預設是公尺 以剛剛[GeoTest] 資料表為例,其中的Geo欄位是geography的資料型別 所以可以直接 SELECT Geo.STDistance('POINT (122.43, 24.02)'))  算出Geo這個欄位跟點 122.34, 24.02的距離是150127.0711 meters