mysql - 如何根据 MySQL 中的 LAT/LONG 和距离获取最近的邻居位置?

标签 mysql spatial spatial-query

我需要根据纬度和经度以及距离参数获取最近邻居商家位置的列表。 为此,我使用下面的查询创建了一个表:

**create table location.ML_POINTS_5K(
    MERCHANT_ID         INT(15), 
    STREET_ADDRESS      VARCHAR(50), 
    CITY                VARCHAR(50), 
    STATE               VARCHAR(25), 
    ZIPCODE             VARCHAR(11), 
    COUNTRY             CHAR(2),      
    ACCESSIBILITY       CHAR(1),      
    LOCATION_GEO_CODES_SDO  POINT NOT NULL, 
    BRAND_ID INT(7) NOT NULL,
    SPATIAL INDEX(LOCATION_GEO_CODES_SDO),
    PRIMARY KEY(MERCHANT_ID),
    FOREIGN KEY(BRAND_ID) REFERENCES BRAND(BRAND_ID)    
) ENGINE=MyISAM;**

现在,我还使用以下示例查询将一些记录插入到该表中,以确保点几何形状插入正确。

**INSERT INTO LOCATION.ML_POINTS_5K VALUES(11111,'111 678 St','Warren', 'OH', '11111','US','Y',GeomFromText('POINT(-82.7071458 39.90564701)'),1004);**

现在我需要在 MYSQL 中构造一个选择查询,它将返回该表中指定纬度、经度和距离的所有位置。

例如,如果我的纬度为 39.34 ,经度为 -84.56 ,距离为 5 英里,我如何构造一个查询来从我上面创建的表中获取 5 英里距离内的所有位置记录.?..

最佳答案

我认为可以用这样的方法来完成:-

SELECT MERCHANT_ID, STREET_ADDRESS, CITY, STATE, ZIPCODE, COUNTRY, (GLength(LineStringFromWKB(LineString(LOCATION_GEO_CODES_SDO, GeomFromText('POINT(-84.56 39.34)'))))) * (1000000 / 1604) AS distance
FROM ML_POINTS_5K
WHERE ((GLength(LineStringFromWKB(LineString(LOCATION_GEO_CODES_SDO, GeomFromText('POINT(-84.56 39.34)'))))) * (1000000 / 1604)) < 5

我认为默认距离以数百公里为单位,因此需要对其进行操作以使其以英里为单位。

基于此的代码:-

http://www.tech-problems.com/calculating-distance-in-mysql-using-spatial-point-type/

关于mysql - 如何根据 MySQL 中的 LAT/LONG 和距离获取最近的邻居位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17046685/

相关文章:

mysql - 如何使用相关子查询进行更新?

php - 如何使用 PHP 生成正确的订单号?

r - 使用 sf 围绕点(质心)创建网格

mysql - 如何成功执行MySQL空间缓冲功能?

mysql - 如何使用 MySQL Spatial Extensions 创建具有半径和中心坐标的圆形几何体?

多边形查询和数据库设置中的 MySQL 点

mysql - DBI:如果第一个数据库不存在,则连接到另一个数据库

java - 我有一个基本的 UpdateWhere 语句,该语句在语法上是正确的,但不会更新表

oracle - 在Oracle中,当内部查询包含SDO_ANYINTERACT时,为什么不能在外部查询中选择rownum?

java - Solr 空间距离错误