这是一个废话,但我想我会选择更有经验的大脑。
您可能知道,您可以使用以下查询来查找两组坐标之间的距离。
DECLARE @source geography = 'POINT(-93.54803 39.790132)'
DECLARE @target geography = 'POINT(-105.0207 39.9652)'
SELECT @source.STDistance(@target)/1609.344 AS distance_in_miles
我想找到两个邮政编码之间的距离,而不必使用半正式公式,所以我写了这个:
DECLARE @source GEOGRAPHY
DECLARE @target GEOGRAPHY
DECLARE @Szip VARCHAR(10) = '64601'
DECLARE @Ezip VARCHAR(10) = '80023'
SET @source = (SELECT longitude+ ' ' +latitude FROM us_loc_data WHERE @Szip = zip)
SET @target = (SELECT longitude+ ' ' +latitude FROM us_loc_data WHERE @Ezip = zip)
SELECT @source.STDistance(@target)/1609.344 AS distance_in_miles
我认为上述内容不起作用,并且由于这个原因不起作用:
Msg 6522,Level 16,State 1,Line 5 执行用户定义的例程或聚合“地理”期间发生.NET Framework错误: System.FormatException:24114:输入的已知文本(WKT)中的标签-93.54803 39.790132无效。
我目前的理解是,为了真正起作用,封装在括号中的一对坐标需要夹在字符串开头的POINT引号之间。
我想知道我尝试做的事情是否可以远程实现。 我可以以某种方式将select语句分配给我的变量(@source& @target)来查询坐标,而不是显式指定我想要使用的坐标吗?
答案 0 :(得分:1)
示例强>
DECLARE @Origin GEOGRAPHY
DECLARE @Target GEOGRAPHY
DECLARE @Szip VARCHAR(10) = '64601'
DECLARE @Ezip VARCHAR(10) = '80023'
Select @Origin =GEOGRAPHY::Point([latitude], [longitude], 4326) from us_loc_data WHERE @Szip = zip
Select @Target =GEOGRAPHY::Point([latitude], [longitude], 4326) from us_loc_data WHERE @Ezip = zip
SELECT Distance = @Origin.STDistance(@Target)/1609.344
退货(使用我的邮政编码数据库)
610.093230351351