0

我存储在我的一张表中的是以下格式的地理点:

经度纬度邮政编码

这个想法是使用表中的信息通过给定的经度和纬度获取最接近的可用邮政编码。

我的算法工作如下:

  1. 初始化 UserLongitude 和 UserLatitude
  2. 初始化 StepVariable 为 1.0
  3. 从我的表中获取所有记录

    longitude>UserLongitude-StepVariable 
    and
    longitude<UserLongitude+StepVariable 
    and
    latitude>Userlatitude-StepVariable   
    and
    latitude<Userlatitude+StepVariable
    
  4. 如果没有找到记录,将 StepVariable 增加 1.0 并执行步骤 3

正如我所读到的,当我们移动到两极时,1.0 的经度值会变小。因此,当经度和纬度的 1.0 值不同时,我的算法将以不正确的方式扩展搜索区域。

有没有一种棘手的方法可以将我的可搜索区域扩展为 Square,因为现在,在某些地方我有矩形,我相信这会使我的搜索速度变慢。

4

2 回答 2

0

我建议使用GeographyandGeometry数据类型及其相关函数(例如STDistance:)

请参阅http://msdn.microsoft.com/en-us/library/bb933917(v=sql.100).aspx

如果你不能这样做,那么Haversine 公式对于计算距离很有用

于 2012-11-08T10:08:11.303 回答
0

为了计算特定地理点的经纬度长度是多少米,我使用以下算法:

-- Geograpic Point Cordinates
DECLARE @LATTIDUDE REAL=45
DECLARE @LONGITUDE REAL=45
DECLARE @Distance REAL=10

-- Constants
DECLARE @ConvertionConstant AS FLOAT=2*PI()/360
DECLARE @MetersPerDegree AS FLOAT

DECLARE @LattidueInRadians AS FLOAT=@ConvertionConstant*@LATTIDUDE

DECLARE @LongitudeParameter1 AS FLOAT=111412.84
DECLARE @LongitudeParameter2 AS FLOAT=-93.5 
DECLARE @LongitudeParameter3 AS FLOAT=0.118

SET @MetersPerDegree=(@LongitudeParameter1*COS(@LattidueInRadians))+(@LongitudeParameter2*(COS(3*@LattidueInRadians)))+(@LongitudeParameter3*COS(5*@LattidueInRadians))
DECLARE @LongitudeRangeTemp AS FLOAT=@Distance/(@MetersPerDegree/1000)

-- Results for longitude
SELECT @LongitudeRangeTemp AS DegreesForGivenKM
SELECT @MetersPerDegree    AS MetersPerDegreeOfLongitude

-- Constants
DECLARE @LatitudeParameter1 AS FLOAT=111132.92
DECLARE @LatitudeParameter2 AS FLOAT=-559.82
DECLARE @LatitudeParameter3 AS FLOAT=1.175
DECLARE @LatitudeParameter4 AS FLOAT=-0.0023

-- Results for longitude
SET @MetersPerDegree=(@LatitudeParameter1+(@LatitudeParameter2*COS(2*@LattidueInRadians))+(@LatitudeParameter3*COS(4*@LattidueInRadians))+(@LatitudeParameter4*COS(6*@LattidueInRadians)))
DECLARE @LatitudeRangeTemp AS FLOAT=@Distance/(@MetersPerDegree/1000)
SELECT @LatitudeRangeTemp AS  DegreesForGivenKM
SELECT @MetersPerDegree   AS  MetersPerDegreeOfLatitude

为公里添加了一个附加参数 - 代码将计算多少度等于给定的公里。

您可以自由地在函数中实现代码。

于 2012-11-21T13:45:42.643 回答