【问题标题】:Getting all zip codes with a distance of 50 miles from a specific zip code获取距离特定邮政编码 50 英里的所有邮政编码
【发布时间】:2013-03-11 01:10:48
【问题描述】:

我有一个页面,用户可以在其中插入他们的邮政编码,它会返回他们的邮政编码附近的所有邮政编码。

现在我有这张桌子

CREATE TABLE [dbo].[zip](
    [zipcode] [varchar](5) NOT NULL,
    [state] [varchar](2) NULL,
    [city] [varchar](50) NULL,
    [longitude] [float] NULL,
    [latitude] [float] NULL,        
    [CreateStamp] [smalldatetime] NULL,
    [state_name] [varchar](50) NULL,        
)

如果你能给我一个完整的指导,我不知道该怎么做,那就太好了

结果是用户插入他们的邮政编码,然后查询将返回他们自己的邮政编码 50 英里范围内的所有邮政编码。

【问题讨论】:

  • 如何计算距离?
  • 我假设您的表格提供了每个邮政编码的“中心”的经度和纬度,并且任务是在距离给定邮政编码的“中心”的给定距离内找到所有邮政编码,对?如果确实是这种情况,您可能需要使用此参考:johndyer.name/…>.
  • PM 77-1 是的,这就是任务,我确实有每个邮政编码的经度和纬度。
  • PM 我去那个网站时收到 404 错误
  • @Neo - 查看我刚刚在上面添加的链接。 SELECT 语句本身很简单,但您需要实现在球体(不是平面)上查找距离的公式。

标签: sql sql-server distance latitude-longitude


【解决方案1】:

如果您使用的是SQL Server 2008 及更高版本,则可以使用GEOGRAPHY 数据类型。 首先,您需要根据其邮政编码获取中心的Geography 位置,然后选择指定距离内的所有记录。要计算距离,请使用STDistance 方法。 这是一个例子:

DECLARE @cZip VARCHAR(5)
SET @cZip = '<center zip code>'
DECLARE @dMin DECIMAL = 50 * 1609.344 -- metres

DECLARE @c GEOGRAPHY
SELECT @c = GEOGRAPHY::Parse('Point(' + CAST(longitude AS VARCHAR) + ' ' + CAST(latitude AS VARCHAR) + ')')
FROM zip
WHERE zipcode = @cZip

SELECT * 
FROM zip 
WHERE @c.STDistance(GEOGRAPHY::Parse('Point(' + CAST(longitude AS VARCHAR) + ' ' + CAST(latitude AS VARCHAR) + ')')) <= @dMin

【讨论】:

    猜你喜欢
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多