纬度和度量在MySQL数据库中怎么存储

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了纬度和度量在MySQL数据库中怎么存储相关的知识,希望对你有一定的参考价值。

参考技术A

可以使用字符串varchar,然后取出数据之后将字符串转化为double类型或float类型


可以存储这些经/纬度数据,如波纹管 -

$arr = array("13.692941, 100.750723", 

"13.70649,100.75405999999998", 

"13.71334,100.75428999999997", 

"13.72268,100.74638000000004"); 

// serialize data before save to database, you should deserialized that when you will use this data after query. 

$serializedArr = serialize($arr); 

insert into geom (g) values ("$serializedArr"); 

检索用户给定的最近地理点(纬度/经度)的最佳方法,我有存储在 MySQL 数据库中的所有地理点的列表

【中文标题】检索用户给定的最近地理点(纬度/经度)的最佳方法,我有存储在 MySQL 数据库中的所有地理点的列表【英文标题】:Best way to retrieve nearest geopoints (lat/long) to the one given by user, i have the list of all geopoints stored in a MySQL database 【发布时间】:2011-03-09 18:57:43 【问题描述】:

我正在尝试创建一个移动应用程序,该应用程序捕获用户当前的地理点(纬度/经度)并将其发送到网络服务,网络服务从长列表中返回 5 个最近的地理点。我不清楚的是如何获得最近的 5 个地理点(我最初的方法是,从数据库中获取所有点,然后计算每个地理点和用户地理点之间的距离,并提供离他最近的 5 个)明智的处理成本并不高。关于我该怎么做的任何建议?如果需要更多信息,请告诉我,以便我重新发布。

【问题讨论】:

【参考方案1】:

有多种方法可以做到这一点,您需要达到的最佳程度可能取决于您拥有的点数(因此它可以很好地扩展)。

对于空间查询,您应该使用支持空间索引的数据库,这样可以加快搜索速度。 PostGIS 就是一个例子,MySQL http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html 有 GIS 扩展。

这是 PostGIS http://www.bostongis.com/?content_name=postgis_nearest_neighbor_generic 中 k-最近邻问题的示例解决方案@

编辑:您还可以使用使用 geohashing (http://en.wikipedia.org/wiki/Geohash) 的技术,但请务必仔细阅读本文中的限制。

【讨论】:

我将使用空间查询。我完成后会发布。非常感谢。【参考方案2】:

在我们的contact adress search on esperanto.de 中,我们使用了这个 SQL 语句的变体(包装在 PHP 语法中):

$demando =
  "SELECT DISTINCT id, [...]" .
  "   AVG(tie.longitudo) AS longitudo, AVG(tie.latitudo) AS latitudo, ".
  "   ROUND(111.3 *  SQRT( POW(($chi[latitudo] - AVG(tie.latitudo)),2) + " .
  "                        POW((($chi[longitudo] - AVG(tie.longitudo)) * COS(($chi[latitudo] + AVG(tie.latitudo)) / 114.6 )),2) )) " .
  "       AS efektiva_distanco " .
  " FROM MA_Adresoj, gxustaj_plzkoord AS tie " .
  " WHERE ( " . $pliaj_restriktoj . ") " .
  "  and (tie.plz = urba_kodo) " .
  " GROUP BY id, urba_kodo, nomo_pers, nomo_fam, adresaldono, strato, loko," .
  "          telefono, retadreso " .
  " HAVING efektiva_distanco < '" . $distanco . "' " .
  " ORDER BY " . $ordo;

过滤给定距离内的所有条目 ($distanco)。这有点复杂,因为我们需要为单个邮政编码平均出几个坐标(这应该在坐标数据库上完成,但不是。)

这里的核心是根据经纬度(度)计算距离:

111.3 *  SQRT( POW(here.latitude - there.latitude),2) +
               POW((here.longitude - there.longitude) * COS( (here.latitude + there.latitude) / 114.6 ),2) ))

(结果是以公里为单位的距离。)

我不确定这个公式是普遍适用还是在某种程度上适用于德国(或仅适用于较小的距离 - 我认为当赤道的一个点位于赤道的北部而另一点位于具有相似绝对纬度的南部时,它会计算出太大的距离...以及当东西方差异很大时)。

当然,如果你有很多点,这会变得很慢 - 那么你要么必须像 iluxas 回答那样做一些预过滤,或者更好地使用具有空间索引的数据库。

【讨论】:

【参考方案3】:
select x, y, sqrt((x-userX)^2, (y-userY)^2) as distance from points
where x > userX - 10 and x < userX + 10
and y > userY - 10 and y < userY + 10
order by distance asc
limit 5

语法非常近似,当然

【讨论】:

仅当您确定圆中至少有 5 个点或该点周围的半径为 20 时才有效。而且您的距离计算仅在赤道附近有效 - 对于其他位置,您必须添加校正,因为地球不平坦。 在数据库层做计算距离的算法最好吗?假设我有 3 层,客户端(移动应用程序)、应用程序(接收查询并发送回响应的 Web 服务)和数据库层(包含所有点 [纬度/经度]) 我正在考虑使用考虑地球半径的Haversine公式。我不想限制搜索的范围。我希望为客户提供这种方案:按城市和服务类型(加油站、药房、餐厅)过滤的 5 个最近地理点。 不,不要使用 sqrt()。这是一个非常缓慢的功能。按平方距离排序,结果会更好。

以上是关于纬度和度量在MySQL数据库中怎么存储的主要内容,如果未能解决你的问题,请参考以下文章

如何在数据库中存储经度和纬度。 MySQL不会超过-99.9999999 [关闭]

需要使用 PHP 将 android app 生成的纬度和经度值存储到 mySQL 数据库中

在 MySQL 数据库中存储纬度/经度时使用的理想数据类型是啥?

在 Mysql 中存储经度/纬度的数据类型

存储纬度和经度的最佳 mysql 数据类型是啥?

MySQL的GIS、GEO入门笔记