t-SQL:地理点字符串内的选择语句

Posted

技术标签:

【中文标题】t-SQL:地理点字符串内的选择语句【英文标题】:t-SQL: select statement inside of geography POINT string 【发布时间】:2017-03-22 22:46:58 【问题描述】:

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

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

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

我认为上面的方法行不通,因为这个原因它也行不通:

消息 6522,第 16 级,状态 1,第 5 行 在执行用户定义的例程或聚合“地理”期间发生 .NET Framework 错误: System.FormatException: 24114: 输入熟知文本 (WKT) 中的标签 -93.54803 39.790132 无效。

我目前的理解是,为了让它真正起作用,一对用括号封装的坐标需要夹在字符串开头的引号之间。

我想知道我正在尝试做的事情是否可行。 我能否以某种方式将 select 语句分配给我的变量(@source 和 @target)以查询坐标,而不是明确指定 要使用哪个 坐标?

【问题讨论】:

【参考方案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

【讨论】:

再次感谢您帮助我 :) @AnthonySims 很高兴为您提供帮助,.. 再次... :)

以上是关于t-SQL:地理点字符串内的选择语句的主要内容,如果未能解决你的问题,请参考以下文章

在 MySQL 中使用 GPS 坐标快速检索 SELECT 语句

获取半径内的附近街道地址

区域内的地理点

T-SQL 高级查询

T-SQL高级查询语句

T-SQL 语句中的前缀 N 是啥意思,啥时候应该使用它?