在我没有开发的 PHP 程序中,我可以通过表单输入与给定美国邮政编码(以英里为单位的半径)的距离,从中进行邻近搜索。
我们以北卡罗来纳州加斯托尼亚市为例,其邮政编码为 28054,半径为 10 英里。
PHP 代码动态生成 SQL 查询。在达到这一点之前,它会在幕后进行计算并给出这些值:
:minlat (Float) 35.084832880851
:maxlat (Float) 35.374297119149
:minlon (Float) -81.305653802747
:maxlon (Float) -80.951286197253
它也给出了这个距离:
:distance (Float) 16093.47
鉴于我在表单中输入的距离,我无法查看或操作生成这些值的代码。但是,我可以覆盖每个计算变量的值。
我理解:minlat
and :minlon
,它是我邮政编码的中心点。我不明白的是,它与和:distance
有什么关系?:maxlat
:maxlon
:distance
以 10 英里的形式开始的测量是什么类型的?
显然:distance
添加:maxlat
或:maxlon
没有任何意义。
我最终想要做的是取一个:minlat
and :minlon
,我有一个点数据库,然后搜索某个:distance
.
所以,如果我想搜索 20 英里,那将是 :distance 32186 ish,但这对 maxlat 和 maxlon 有何影响?
如果您对整个 SQL 查询感兴趣,它是:
SELECT node.title AS node_title,
node.nid AS nid,
node.created AS node_created,
'node' AS field_data_field_item_photos_node_entity_type,
(COALESCE(ACOS(0.81684734668492*COS(RADIANS(location.latitude))*(0.15421945466762*COS(RADIANS(location.longitude)) + -0.9880366186544*SIN(RADIANS(location.longitude))) + 0.57685389156511*SIN(RADIANS(location.latitude))), 0.00000)*6370997.0816549) AS location_distance
FROM
{node} node
LEFT JOIN {location_instance} location_instance ON node.vid = location_instance.vid
LEFT JOIN {location} location ON location_instance.lid = location.lid
WHERE (( (node.status = '1')
AND (location.latitude > '35.084832880851'
AND location.latitude < '35.374297119149'
AND location.longitude > '-81.305653802747'
AND location.longitude < '-80.951286197253')
AND ((COALESCE(ACOS(0.81684734668492*COS(RADIANS(location.latitude))*(0.15421945466762*COS(RADIANS(location.longitude)) + -0.9880366186544*SIN(RADIANS(location.longitude))) + 0.57685389156511*SIN(RADIANS(location.latitude))), 0.00000)*6370997.0816549) < '16093.47') ))
表结构
+-----------+----------------+------+-----+-------- --+--------+ | 领域 | 类型 | 空 | 钥匙 | 默认 | 额外 | +-----------+----------------+------+-----+-------- --+--------+ | 拉链 | varchar(16) | 否 | 穆尔 | 0 | | | 城市| varchar(30) | 否 | | | | | 状态 | varchar(30) | 否 | | | | | 纬度 | 十进制(10,6) | 否 | 穆尔 | 0.000000 | | | 经度 | 十进制(10,6) | 否 | 穆尔 | 0.000000 | | | 时区 | 小整数(4) | 否 | | 0 | | | dst | 小整数(4) | 否 | | 0 | | | 国家 | 字符(2) | 否 | 穆尔 | | | +-----------+----------------+------+-----+-------- --+--------+