0

在我没有开发的 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

鉴于我在表单中输入的距离,我无法查看或操作生成这些值的代码。但是,我可以覆盖每个计算变量的值。

我理解:minlatand :minlon,它是我邮政编码的中心点。我不明白的是,它与和:distance有什么关系?:maxlat:maxlon

:distance以 10 英里的形式开始的测量是什么类型的?

显然:distance添加:maxlat:maxlon没有任何意义。

我最终想要做的是取一个:minlatand :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) | 否 | 穆尔 | | |
+-----------+----------------+------+-----+-------- --+--------+
4

0 回答 0