select within 20 kilometers based on latitude/longitude(根据纬度/经度在20公里内选择)
问题描述
我有一个按照以下示例构建的 mysql 表:
i have a mysql table structured as per the example below:
POSTAL_CODE_ID|PostalCode|City|Province|ProvinceCode|CityType|Latitude|Longitude
7|A0N 2J0|Ramea|Newfoundland|NL|D|48.625599999999999|-58.9758
8|A0N 2K0|Francois|Newfoundland|NL|D|48.625599999999999|-58.9758
9|A0N 2L0|Grey River|Newfoundland|NL|D|48.625599999999999|-58.9758
现在我要做的是创建一个查询,该查询将选择搜索位置选定公里范围内的结果
now what i am trying to do is create a query that will select results within selected kilometers of a searched location
假设他们搜索灰色河流"并选择查找 20 公里内的所有结果"
so lets say they search for "grey river" and select "find all results within 20 kilometers"
显然应该选择灰河",但也应该根据经纬度选择灰河20公里范围内的所有位置.
it should obviously select "grey river", but it should also select all locations within 20 kilometers of grey river based on the latitudes and longitudes.
我真的不知道该怎么做.我已经阅读了半正弦公式,但不知道如何将其应用于 mysql SELECT.
i really have no idea how to do this. i've read up on the haversine formula but have no idea how to apply this to a mysql SELECT.
任何帮助将不胜感激.
推荐答案
SELECT *
FROM mytable m
JOIN mytable mn
ON ACOS(COS(RADIANS(m.latitude)) * COS(RADIANS(mn.latitude)) * COS(RADIANS(mn.longitude) - RADIANS(m.longitude)) + SIN(RADIANS(m.latitude)) * SIN(radians(mn.latitude))) <= 20 / 6371.0
WHERE m.name = 'grey river'
如果您的表是 MyISAM
,您可能希望以原生几何格式存储您的点并在其上创建一个 SPATIAL
索引:
If your table is MyISAM
you may want to store your points in a native geometry format and create a SPATIAL
index on it:
ALTER TABLE mytable ADD position POINT;
UPDATE mytable
SET position = POINT(latitude, longitude);
ALTER TABLE mytable MODIFY position NOT NULL;
CREATE SPATIAL INDEX sx_mytable_position ON mytable (position);
SELECT *
FROM mytable m
JOIN mytable mn
ON MBRContains
(
LineString
(
Point
(
X(m.position) - 0.009 * 20,
Y(m.position) - 0.009 * 20 / COS(RADIANS(X(m.position)))
),
Point
(
X(m.position) + 0.009 * 20,
Y(m.position) + 0.009 * 20 / COS(RADIANS(X(m.position))
)
),
mn.position
)
AND ACOS(COS(RADIANS(m.latitude)) * COS(RADIANS(mn.latitude)) * COS(RADIANS(mn.longitude) - RADIANS(m.longitude)) + SIN(RADIANS(m.latitude)) * SIN(radians(mn.latitude))) <= 20 / 6371.0
WHERE m.name = 'grey river'
这篇关于根据纬度/经度在20公里内选择的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:根据纬度/经度在20公里内选择
基础教程推荐
- 在 yii2 中迁移时出现异常“找不到驱动程序" 2022-01-01
- 如何在 Symfony 和 Doctrine 中实现多对多和一对多? 2022-01-01
- PHP 守护进程/worker 环境 2022-01-01
- Doctrine 2 - 在多对多关系中记录更改 2022-01-01
- 找不到类“AppHttpControllersDB",我也无法使用新模型 2022-01-01
- phpmyadmin 错误“#1062 - 密钥 1 的重复条目‘1’" 2022-01-01
- HTTP 与 FTP 上传 2021-01-01
- 在 CakePHP 2.0 中使用 Html Helper 时未定义的变量 2021-01-01
- 使用 PDO 转义列名 2021-01-01
- 如何在 XAMPP 上启用 mysqli? 2021-01-01