【问题标题】:Inaccurate distance from geosearch using bounding circle使用边界圆与地理搜索的距离不准确
【发布时间】:2014-02-18 22:23:36
【问题描述】:

我一直在尝试不同的方法来加快网站上的位置搜索,我一直在接受http://www.movable-type.co.uk/scripts/latlong-db.html 的指示。

代码已针对我的表格进行了定制并输入了变量,因此我可以通过 phpmyadmin 运行它

Select id, outcode, lat, lng, acos(sin(57.101)*sin(radians(lat)) + 
cos(57.101)*cos(radians(lat))*cos(radians(lng)-'-2.27')) * 3959 As D
From 
  (Select id, outcode, lat, lng
   From car_postcodes
    WHERE
    lat Between 52.7593142577 And 61.4426857423
    And 
    lng Between -10.2633856968 And 5.72338569684
    ) As FirstCut 
Where acos(sin(57.101)*sin(radians(lat)) + 
cos(57.101)*cos(radians(lat))*cos(radians(lng)-'-2.27)) * 3959 < 7000
Order by D

问题在于搜索结果显示距离该位置 5448(英里?)的最小距离,这是不正确的,因为所有邮政编码都在英国境内。 (因此 '

这是查找最小/最大经度和纬度的代码:

$lat = 57.101;  // latitude of centre of bounding circle in degrees
$lon = -2.27;  // longitude of centre of bounding circle in degrees
$rad = 300;  // radius of bounding circle in kilometers

$R = 3959;  // earth's mean radius, m

// first-cut bounding box (in degrees)
$maxLat = $lat + rad2deg($rad/$R);
$minLat = $lat - rad2deg($rad/$R);
// compensate for degrees longitude getting smaller with increasing latitude
$maxLon = $lon + rad2deg($rad/$R/cos(deg2rad($lat)));
$minLon = $lon - rad2deg($rad/$R/cos(deg2rad($lat)));

前三个结果显示:

 ID     postcode      lat      lng      D      
 1143   HS2           58.249   -6.468   5428.525603021315 
 1142   HS1           58.213   -6.381   5432.53243648885
 1144   HS3           57.879   -6.853   5435.933627885293

表中的 lng 和 lat 列以二进制形式存储并被索引。

任何建议将不胜感激。

【问题讨论】:

  • 我没有时间帮你解决这个问题,但我怀疑度数和弧度之间存在单位问题。

标签: php mysql geolocation latitude-longitude


【解决方案1】:

您可以使用:start_lat:start_lng:min_distance:max_distance 运行此程序,d 以英里为单位。我在我的代码中没有遇到速度问题,但请告诉我它是如何运行的。

SELECT SQL_CALC_FOUND_ROWS
                *
                FROM (SELECT id, outcode, lat, lng, ( 3959*(2*ASIN(SQRT(POW(SIN(((car_postcodes.lat-:start_lat)*(PI()/180))/2),2)+COS(car_postcodes.lat*0.017453293)*COS(:start_lat*0.017453293)*POW(SIN(((car_postcodes.lng-:start_lgn)*(PI()/180))/2),2)))) ) AS d
                    FROM car_postcodes
                WHERE 1) AS tmp_tbl
            WHERE d <= :max_distance AND d >= :min_distance
            ORDER BY d ASC

【讨论】:

  • 它可以运行,但我遇到了与前面的代码类似的问题。使用示例邮政编码 AB14,半径在 0 到 200 英里之间,显示的最近(唯一)邮政编码是北爱尔兰。
  • 我检查了其他几个邮政编码,似乎离它大约 200 英里。测试 CV3,从某个地方显示结果是锡利岛。所以至少它是一致的
猜你喜欢
  • 2011-08-26
  • 2012-07-18
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多