t-SQL:在地理位置内选择语句POINT字符串

时间:2017-03-22 22:46:59

标签: sql-server-2008 tsql geolocation geography

这是一个废话,但我想我会选择更有经验的大脑。

您可能知道,您可以使用以下查询来查找两组坐标之间的距离。

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)来查询坐标,而不是显式指定我想要使用的坐标吗?

1 个答案:

答案 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