2017-05-18 14 views
8

Tôi có hai tọa độ GPS tôi muốn tính toán khoảng cách giữa những điều đó nhưng kết quả trên máy chủ SQL hoàn toàn khác với kết quả trong C# tôi googled và thấy rằng cả hai phương pháp tiếp cận khoảng cách về mét nhưng sự khác biệt này là lái xe tôi điên.SQL Server Geography vs DbGeography

SQL SERVER Query

select geography::Point(25.3132666, 55.2994054 ,4326) 
         .STDistance(geography::Point(25.25434, 55.32820,4326)) as Distance; 

Result of above sql query

Web API

String format = "POINT(25.25434 55.32820)"; 
       DbGeography myLocation = DbGeography.PointFromText(format, 4326); 
       var users = context.Users.Select(u => new 
       { 
        fullName = u.name, 
        lat = u.location.Latitude, 
        lng = u.location.Longitude, 
        distance = myLocation.Distance(u.location) 
       }).ToList(); 

đáp ứng

,{"fullName":"jons smith","lat":25.3132666,"lng":55.2994054,"distance":4133581.8647264037} 

Cảm ơn trước.

+0

Nếu để so sánh trực tiếp mã trong câu hỏi của bạn chúng tôi không biết vị trí của người dùng là gì. Trong SQL bạn hardcode một số tọa độ. Tôi cho rằng chúng khác với tọa độ của người dùng. –

+0

Khẳng định cả hai đều sử dụng cùng một hệ thống trắc địa (hầu hết có thể là WGS 84). Tuy nhiên, tôi có thể tưởng tượng phép tính có thể khác nhau, ví dụ: tùy thuộc vào đường kính trái đất được sử dụng (Đưa vào tài khoản trái đất không phải là một quả cầu hoàn hảo). Chỉ cần đoán ... – CHS

+0

@AndriiLitvinov Tôi chỉ dán bản ghi đó từ phản hồi dưới dạng tham chiếu có cùng giá trị giống nhau, bạn có thể thấy thời lượng dài của bản ghi chính xác giống như của SQL-Query –

Trả lời

13

Kiểm tra độ và vĩ độ trật tự trong các đại diện WKT của điểm trong SQL khi xác định điểm, họ là như sau GEOGRAPHY::POINT(Latitude, Longitude, srid):

SELECT GEOGRAPHY::Point(25.3132666,55.2994054 ,4326) 
        .STDistance(GEOGRAPHY::Point(25.25434, 55.32820,4326)) as distance; 
//distance: 7142.94965953253 

Nhưng khi xác định DBGeography trong mã C#, thứ tự là khác nhau: "POINT(Longitude Latitude)"

String format = "POINT(55.32820 25.25434)"; 
DbGeography myLocation = DbGeography.PointFromText(format, 4326); 
var users = context.Users.Select(u => new 
{ 
    fullName = u.name, 
    lat = u.location.Latitude, 
    lng = u.location.Longitude, 
    distance = myLocation.Distance(u.location) 
}).ToList(); 

//distance: 7142.949659532529 

Ngoài ra, bạn nên kiểm tra các vị trí đó được đưa vào bảng Users. Đảm bảo khi chèn chúng đã được chèn chính xác. Nếu không họ sẽ ở một nơi khác không phải là vị trí của bạn Users

More:

SELECT GEOGRAPHY::Point(25, 55 ,4326).Lat      //25 

DbGeography.PointFromText("POINT(25 55)", 4326).Latitude.Value //55 

Microsoft.SqlServer.Types.SqlGeography.STPointFromText(
      new System.Data.SqlTypes.SqlChars("POINT(25 55)"), 4326).Lat.Value; 
                   //55 

WKT là gì và nơi nào nó đến từ đâu? Đó là một W ell- K nown T đại diện ext các loại hình học khác nhau đó là giới thiệu bởi OGC trong đặc tả Simple Feature Access và tất cả các nhà cung cấp phần mềm nên làm theo nó trong lợi ích của tính tương thích.Đặc điểm kỹ thuật này cho chúng ta thấy cách xác định điểm, đường thẳng (đường kẻ), đa giác và một số loại hình dạng khác dưới dạng văn bản (WKT) và nhị phân (WKB).

Máy chủ SQL không hoàn toàn tuân theo đặc điểm kỹ thuật này và chúng tôi thấy kết quả của các tiêu chuẩn không theo sau, gây ra các vấn đề như vậy trong các thành phần khác nhau của cùng một công ty.

4

Chuyển đổi Lat/Lng trong phiên bản API. Trong API, nó nên đi LNG Lạt

select geography::Point(25.3132666, 55.2994054 ,4326).STDistance(geography::Point(25.25434, 55.32820,4326)) as Distance 

Returns

7142.94965953253 

Đây là nơi tôi lật một Lat/LNG usinq UDF tôi

Select [dbo].[udf-Geo-Meters](55.2994054,25.3132666 ,25.25434,55.32820) 

Returns

4135883.9028193 
2

Vấn đề là rất nhỏ nhưng khéo léo

SQL SERVER Query

geography::Point(25.3132666, 55.2994054 ,4326) 

SQL Server định nghĩa một điểm sao cho giá trị đầu tiên là vĩ độ và giá trị thứ hai là kinh độ.

Web API

String format = "POINT(25.25434 55.32820)"; 
DbGeography myLocation = DbGeography.FromText(format); 

C# định nghĩa một điểm từ trên định dạng theo cách như vậy mà giá trị đầu tiên là kinh độ và giá trị thứ hai là vĩ