我在下面的查询中遇到了关于lat / lng顺序的问题,如果我把坐标放在错误的顺序(lng,lat),它就有效。然而地理:: Point应该采取lat然后lng,这是非常奇怪的。我试着检查谷歌地图上的lat / lng,它在正确的位置,顺时针顺序的多边形,一切看起来都很好,查询如下:
DECLARE @branch_id int = 0;
DECLARE @point geography;
SET @point = geography::Point(31.3353608924066, 30.0798141318826, 4326);
SELECT B.ID, B.DeliveryZone, A.LatLong
FROM [dbo].[Branches] AS B
INNER JOIN [dbo].Addresses AS A ON B.AddressID = A.ID
WHERE B.ServiceProviderID = 2 AND
B.Deleted = 0 AND
B.DeliveryZone.STBuffer(1000).STIntersects( @point ) > 0 ;
答案 0 :(得分:1)
SQL Server documentation for Point不一致。它说:
Lat - 是一个浮点表达式,表示正在生成的Point的x坐标。
纬度通常用作y坐标,即距离赤道有多远的北方或南方。
Long给出了同样的不一致:
Long - 浮点表达式,表示正在生成的Point的y坐标。
当然,经度通常被解释为x坐标,即距离本初子午线有多远的东西。
此外,所有SRID都没有使用lat和lng,只是定义了未注册的坐标系统(如4326),所以“Lat”和“Long”是文档中通用参数名称的不良选择。
根据文档中的这些问题,最有可能的是,对于EPSG 4326,数据库需要(x,y)
顺序的坐标,因此(lng, lat)
,不 {{1} }。这也与大多数其他空间系统在EPSG 4326中定义坐标的方式一致。