当前位置:  开发笔记 > 编程语言 > 正文

用SQLite计算大圆距离

如何解决《用SQLite计算大圆距离》经验,为你挑选了1个好方法。

这是我的问题,我有一个包含位置和纬度/经度的SQLite表.基本上我需要:

SELECT location, HAVERSINE(lat, lon) AS distance FROM location ORDER BY distance ASC;

HAVERSINE()是一个PHP函数,应该返回给定一对纬度和经度值的大圆距离(以英里或公里为单位).其中一对应由PHP提供,另一对应由locations表中可用的每个纬度/经度行提供.

由于SQLite没有任何Geo Spatial扩展(AFAIK SpatiaLite存在但仍然......)我猜测最好的方法是使用自定义函数和其中一个PDO方法:

PDO::sqliteCreateFunction()

PDO::sqliteCreateAggregate()

我认为对于这种情况PDO::sqliteCreateFunction()就足够了,但是我对这个函数的有限经验可以简化为类似于PHP手册中提供的用例:

$db = new PDO('sqlite:geo.db');

function md5_and_reverse($string) { return strrev(md5($string)); }

$db->sqliteCreateFunction('md5rev', 'md5_and_reverse', 1);
$rows = $db->query('SELECT md5rev(filename) FROM files')->fetchAll();

我在弄清楚如何获得一个SQLite用户定义函数来同时处理来自PHP和表数据的数据时遇到了一些麻烦.如果有人能帮助我解决这个问题同时也理解SQLite UDF(一个大赢家),我将不胜感激. SQLite IMO)好一点.

提前致谢!



1> Alix Axel..:

到目前为止,我只能想到这个解决方案:

$db = new PDO('sqlite:geo.db');

$db->sqliteCreateFunction('ACOS', 'acos', 1);
$db->sqliteCreateFunction('COS', 'cos', 1);
$db->sqliteCreateFunction('RADIANS', 'deg2rad', 1);
$db->sqliteCreateFunction('SIN', 'sin', 1);

然后执行以下冗长的查询:

SELECT "location",
       (6371 * ACOS(COS(RADIANS($latitude)) * COS(RADIANS("latitude")) * COS(RADIANS("longitude") - RADIANS($longitude)) + SIN(RADIANS($latitude)) * SIN(RADIANS("latitude")))) AS "distance"
FROM "locations"
HAVING "distance" < $distance
ORDER BY "distance" ASC
LIMIT 10;

如果有人能想到更好的解决方案,请告诉我.


我刚刚发现了这个有趣的链接,明天我会试试.

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有