前言
一個小需求的實作,做一個備忘,個人理解,可能存在錯誤,
客戶有很多設備,這些設備分散在不同的地方,現在需要通過小程式獲取附近的(比如1000米)之類的設備串列,以距離排序
第一個想到的的是找百度/騰訊等地圖,看有沒有提供相應的開放api,先將我們的設備id以及對應的經緯度存盤到地圖中,再呼叫某個api,傳入我當前坐標經緯度,然后回傳附近的設備串列,最后沒找到這個介面,應該是有,但是我沒找到
第二個想能不能通過c#用啥演算法實作,太菜搞不定
最后想到sqlserver有個空間資料的概念,最終勉強實作,
參考:空間資料 (SQL Server) efcore中使用空間資料
概述
空間物件其實就是點、線、面之類的意思,我們希望對其進行一些操作,如:查詢得到兩個面之間的交集/差集/并集;以一個點為中心,設定半徑得到一個面;查詢兩個點之間的距離;等等,這些操作如果我們自己用演算法來實作想想有點怕,
c#提供了相應的庫來表示這些空間物件,也提供了相應的方法來執行針對空間物件的操作 ->NetTopologySuite(從java的JTS移植來的)由于這次小需求只是依賴了資料庫對空間資料的支持,所以沒有詳細研究NetTopologySuite(資料少)
sqlserver2008開始支持空間資料,它也提供了相應的型別來表示空間物件,也提供相應的函式來操作這些物件,當然其它資料也支持
估計還有單獨的空間資料引擎,以檔案形式存盤空間物件
這些點/線/面可以放在一個普通平面中,這時把他們看成幾何物件,比如一個點就可以用XY坐標來表示、一個線就可以用兩個點來表示...;
也可以將這些空間物件放在地球環境中來看,那么點就物件就用經緯度來表示、線就用兩個點來表示
幾何圖形與地理位置
同一個空間物件,比如一個點 可以把它放在一個普通的平面坐標中來看待,用XY坐標來表示,也可以放進地球環境中用經緯度來表示,
- Geometry 型別表示歐幾里得(平面)坐標系中的資料,
- Geography 型別表示圓形地球坐標系中的資料,
以點來說,可以創建Geometry型別的點,也可以創建Geography型別的點,資料庫和c#都有物件的創建方式,同理 線、面 都分為這兩種型別
空間資料型別
就是說的上面的點、線、面 當然還有更多型別,NetTopologySuite庫提供了相應的型別來表示,sqlserver中也有相應的型別,但是sqlserver存盤空間物件的欄位的型別只分為Geography和Geometry,只是在插入值的時候會創建不同的物件
空間參考識別符號 (SRID)
檔案的說明看不太懂,反正對我們的限制就是 若我們使用Geography型別的空間物件,那么必須為每個空間物件設定SRID,對多個空間進行操作(比如看距離)時,這些空間物件的SRID必須一樣,
感覺就像是有多個地球,每個地球有一個編號,同一個點(經緯度)在不同的地球(SRID)中其實位置不一樣,不曉得這樣理解對不,
在當前需求中反正寫死4326,檔案中經常用這個,
各種函式
實體方法:一個空間物件就是一個實體,在sql陳述句中可以實體化一個空間物件,資料表那個存盤空間物件的單元格中存盤的就是一個具體的空間物件實體
靜態方法:不屬于空間物件實體的,通過字串創建空間物件,這個方法放實體上不合適
其實跟c#中的實體和靜態一個意思
OGC:應該是個什么標準,定義了空間資料的通用操作,當然分為實體OGC方法和靜態OGC方法
微軟對標準進行了擴展,實體和靜態都有擴展
原始SQL和EFCore實作
efcore不熟 又是第一次用空間資料,所以沒用efcore來實作,本身用的abp 默認是用的efcore,用這個方式本來應該更方便,efcore中使用空間資料
原始sql就簡單了,

沒有用檔案中的空間索引,也沒有直接存盤空間物件,而是查詢時構建
爛尾....
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/61599.html
標籤:C#
上一篇:c# 執行windows模擬登錄
下一篇:C# 實作向指定郵箱發送資訊功能
