当前位置: 首页 > 面试题库 >

根据经度/纬度在20公里内选择

孟洋
2023-03-14
问题内容

我有一个按照以下示例结构的mysql表:

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

现在我想做的是创建一个查询,该查询将在搜索位置的选定公里内选择结果

因此,假设他们搜索“灰色河流”,然后选择“在20公里以内找到所有结果”

它显然应该选择“灰河”,但也应根据经度和纬度选择灰河20公里以内的所有位置。

我真的不知道该怎么做。我已经读过haversine公式,但不知道如何将其应用于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在其上创建索引:

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'


 类似资料:
  • 我有一个Postgres表,其中包含一些使用shapefile创建的数据。我需要找到所有在给定纬度和经度半径2英里范围内相交的记录。我使用了一些查询,包括下面这个。 从us_census_zcta中选择 ST_INTERSECTS(几何、圆(点(40.730610, -73.935242), 2)); 但是没有一个管用。我到底做错了什么?如何才能得到我需要的结果? SRID为4269(NAD 83

  • 在我的应用程序中,我将Yii与PostgreSQL和PostGIS一起使用。我有一个具有字段“location”的模型“user”。Location-field的内容对人来说毫无意义,但是Postgres可以使用st_astext-method将Location-field的值转换为经度和纬度。我已经在我的模型中为经度和纬度创建了虚拟字段。当我保存我的模型时,我使用beforeSave和after

  • Highmaps 从 1.1.0 开始支持经纬度定位功能,该功能依赖第三方库 proj4js(需要在 Highmaps 之前引入),最新版的文件可以从 cdnjs 上获取 <script src="https://cdn.bootcdn.net/ajax/libs/proj4js/2.7.2/proj4.js"></script> 有了经纬度支持后,我们可以通过 lon 和 lat 属性来指定经

  • 之前已经回答了一个类似的问题,但是我找不到这个问题的解决方案: 我有一个带有辐照度值的.txt,我想在 csv 文件中提取特定纬度和纬度的辐照度值的时间系列。.txt文件的(头部)如下所示: 该文件没有lon和lat列(这将是提取数据的简单方法)。然而,它有一个标题,如:NCOLS、NROWS、XLLCORNER、…但是我不知道如何提取像这样的文件的lat/长时间序列。 此外,一旦提取了特定lat

  • 怎么通过经纬度 测算出公里数然后显示费用 每公里2.5元 求大神帮忙改进改进

  • 问题内容: 我有一个目前约有1万行的数据库。它们都基于邮政编码的中心具有经度/纬度。我发现了一个我正在尝试扩展的查询,但是总的来说它在某种程度上运行良好。但是,在下面的示例中,我试图找到半径25英里以内的事物,这似乎在大多数情况下都是可行的。我的大部分结果都在25英里标准范围内,但是我得到的结果很少,偏离了86英里到800英里。 示例:这是我的中心经度:37.2790669,-121.874722