zac*_*ach 12 sql sql-server geospatial
所以这是我的设置:
我有一张桌子如:
Id, Lat, Long, GeoPoint, GeomPoint
两个GeoPoint(地理)和GeomPoint(几何)设置为SRID 4326
我有以下查询:
DECLARE @radiiCollection TABLE
( [ID] INT IDENTITY(1, 1) PRIMARY KEY,
[Radius] GEOMETRY,
[RefPoint] GEOMETRY,
[RefAddr] VARCHAR(255),
[MinLat] VARCHAR(255),
[MaxLat] VARCHAR(255),
[MinLng] VARCHAR(255),
[MaxLng] VARCHAR(255))
DECLARE @point GEOMETRY = geometry::Point(-111.84493459999999, 33.3902569, 4326)
DECLARE @gpoint GEOGRAPHY = geography::Point(33.3902569, -111.84493459999999, 4326);
INSERT INTO @radiicollection
(radius,
refpoint,
refaddr,
maxlat,
maxlng,
minlat,
minlng)
VALUES ( @point.MakeValid().STBuffer(16093.40),
@point,
'10 miles of 85210',
33.51734689767781,
-111.6923852740045,
33.26298081643247,
-111.99703818130439 )
SELECT
GeomPoint,
GeoPoint
INTO #temp
FROM (
SELECT row_number() OVER (
PARTITION BY [ds].[ADDR],
[ds].[APT],
[ds].[ZIP] ORDER BY [ds].[IND_ID] ASC
) recid1, rGeop1.geompoint, rgeop1.GeoPoint
FROM [r].[main] ds
JOIN [r].[GeoPoint] rGeoP1
ON rGeoP1.[UID] = ds.[UID]
JOIN @radiiCollection rr
ON GeomPoint.STWithin(rr.radius) = 1
WHERE 1 = 1
AND (
(
(
(
try_cast(latitude AS DECIMAL(9, 1)) BETWEEN CONVERT(DECIMAL(9, 1), 33.26298081643247)
AND CONVERT(DECIMAL(9, 1), 33.51734689767781)
AND try_cast(longitude AS DECIMAL(9, 1)) BETWEEN CONVERT(DECIMAL(9, 1), - 111.99703818130439)
AND CONVERT(DECIMAL(9, 1), - 111.6923852740045)
)
)
)
)
) f
WHERE recid1 = 1
Run Code Online (Sandbox Code Playgroud)
所以,拉动两者,然后拉动GeoPoint和GeomPoint的STDistance,如下所示:
select top 10
try_cast(GeoPoint.STDistance(@gpoint) as float) DistanceGeo,
try_cast(GeoMPoint.STDistance(@point.MakeValid()) as float) DistanceGeom
from #temp
Run Code Online (Sandbox Code Playgroud)
但我得到的有点奇怪:
DistanceGeo DistanceGeom
-----------------------------------------
10495.1674191715 0.111544285781801
10249.4175883919 0.100540150724826
12307.1907929483 0.1262738924781
11804.655587608 0.116453906202276
10249.4175883919 0.100540150724826
9607.03640753812 0.101614826463312
11130.8413059431 0.100596791997409
10249.4175883919 0.100540150724826
6973.69243171186 0.0644901191669685
9605.88647121359 0.0967178499759486
Run Code Online (Sandbox Code Playgroud)
根据我的理解,SRID确定空间列的度量单位,但很明显,因为这两个都是SRID 4326而不是这种情况?任何帮助,将不胜感激.我相信我在这看到的是度而不是米.在SQL中有一种简单的方法可以将度数转换为米吗?或者改变STDistance用于输出的单位的方法?
您可以通过以下查询获得STDistance正在使用的测量单位的确定答案.对于4326(例如),它是米.
SELECT *
FROM sys.spatial_reference_systems
WHERE spatial_reference_id = 4326
Run Code Online (Sandbox Code Playgroud)
小智 6
使用 SqlGeomety,您正在处理“投影坐标”。
在您的情况下,使用 SqlGeometry 和 WGS84 (4326),您的单位是度。因此 STDistance()、STArea()...将返回度数。
您必须使用以米为单位的投影坐标系(例如法国的 Lambert 93 或美国的 UTM)才能以米为单位进行坐标并以米为单位进行计算。
几何学采用平面地图,地理采用地球的形状。请记住,纬度和经度之间的距离取决于您在地球上的位置(在北极,经度之间的距离接近 0)。
如果您想显示出巨大的差异,请在代码中添加一些更极端的示例...选择靠近北极的一个点和距离北极几度的另一个点。与赤道上的几个点相比......几何距离和地理距离是两个非常不同的术语
| 归档时间: |
|
| 查看次数: |
10383 次 |
| 最近记录: |