【问题标题】:How to find nearest address by lat,long如何通过纬度,经度找到最近的地址
【发布时间】:2016-02-03 13:47:06
【问题描述】:

我创建了一个位置表,其中保存了纬度、经度和位置。我的要求是当我通过 lat,long 时,将获得距该位置表 10 英里内的最近位置。位置表结构如下:-

CREATE TABLE IF NOT EXISTS `locations` (
  `latitude` float(14,12) unsigned NOT NULL,
  `longitude` float(14,12) unsigned NOT NULL,
  `location` varchar(150) NOT NULL,
  PRIMARY KEY (`latitude`,`longitude`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

和 我的查询是:-

  SELECT 
    (3959 * ACOS(COS(RADIANS(lat)) * COS(RADIANS(latitude)) * COS(RADIANS(longitude) - RADIANS(long)) + SIN(RADIANS(lat)) * SIN(RADIANS(latitude)))) AS distance,
    location
FROM
    locations
HAVING distance < 10
ORDER BY distance
LIMIT 0 , 1

我正在使用 MySql 5.6。 位置表中有大约 39,000 个数据。 当这个查询执行时,它需要 5 到 6 秒。

谁能帮我减少执行时间?

谢谢!

【问题讨论】:

  • 虽然看起来代码要多得多,但我怀疑“WHERE(3959 等...”)会明显更快。地址真的不可能在阿拉斯加的安克雷奇吗?说什么?
  • 这是一个棘手的问题。但是代码here 会更快。但这需要对您的架构进行重大更改。
  • 不要在FLOAT 上使用(M,N)。此外, (14,12) 会将经度切割为 100;可能不是你想要的。

标签: mysql distance latitude-longitude


【解决方案1】:

MySQL 支持geospatial datatypes and functions - 这些都经过优化,比通过整数和几何函数执行此操作要快得多。网上有很多教程——this one 很不错。

【讨论】:

  • MySQL 5.6 应该支持地理空间数据类型吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多