[英]using SqlGeography types in C# client-side
在 C# 客戶端,我正在嘗試使用 SQLServerTypes (SqlServerSpatial140.dll) 程序集(編輯:直接這樣做, SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory)
)來測量 pl.net 上各點之間的距離,在一個街道地址和另一個街道地址之間,通常相距在 50 英里以內(但有時更遠)。 每個位置都表示為緯度/經度對。
這是一個框架應用程序,使用 NuGet package。
這段代碼正確嗎? 我認為不可能,因為我得到的distance
值太小了,例如24.35946...
當兩個點相距數百英里時,例如兩個城鎮,其中一個在北卡羅來納州和波多黎各的另一個。 米不是標准單位嗎?
foreach (Origin o in Origins)
{
o.loc = SqlGeometry.Point(o.lat, o.lon, 4326);
foreach (Destination d in Destinations)
{
SqlDouble distance = o.loc.STDistance(SqlGeometry.Point(d.lat, d.lon, 4326));
<snip>
}
}
4326
是正確的 SRID 嗎? 如果 SRID 為零,我會得到相同的結果。 此外,向 Point 提供參數的順序 (lat,lon) 或 (lon,lat) 不會使距離數字變大。
PS 在 Brian 的幫助下,我能夠讓它工作。 這是我實例化點的方式:
public Microsoft.SqlServer.Types.SqlGeography CreateGeographyPoint(double longitude, double latitude)
{
var text = string.Format("POINT({0} {1})", longitude, latitude);
var ch = new System.Data.SqlTypes.SqlChars(text);
return Microsoft.SqlServer.Types.SqlGeography.STPointFromText( ch, 4326);
}
您應該使用 Sqlgeography class 和 4326 的 Srid 將為您提供以米為單位的結果。
SqlGeometry 用於笛卡爾坐標 (x, y),而 SqlGeography 用於地理空間坐標 Long、Lat 的順序。
將 SqlGeometry 替換為 SqlGeography。
這實際上更像是一個 GIS 問題,而不是一個編程問題。
SRID是空間參考ID; 記錄該表中數據的空間參考,或者您在處理或顯示數據時要使用的空間參考。 看:
https://desktop.arcgis.com/en/arcmap/10.3/manage-data/using-sql-with-gdbs/what-is-an-srid.htm
和
您可以查詢表中的數據以查看它記錄在哪個空間參考中。請參閱:
至於那個 SRID 是否正確,那取決於你。 輸入數據時使用的是什么 SRID? 如果您希望它具有相同的空間參考,請使用相同的 SRID。 如果您希望在不同的空間參考中輸出結果,請使用不同的 SRID。 4326 是 WGS84:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.