我正在设计一个 android 应用程序,它将显示您附近的兴趣点 (POI)。POI 将存储在数据库中,我希望能够有效地搜索我附近的 POI,并让搜索返回可能是最近 100 个位置的排序列表。
我想知道我应该如何设计我的数据库,以便可以有效地搜索它。我应该使用任何特定形式的 SQL 或任何特殊算法来加快搜索速度?虽然如果我的数据库中只有 100 个位置不会有问题,但我可以想象如果我有 10,000 个或更多位置可能会很困难。
我正在设计一个 android 应用程序,它将显示您附近的兴趣点 (POI)。POI 将存储在数据库中,我希望能够有效地搜索我附近的 POI,并让搜索返回可能是最近 100 个位置的排序列表。
我想知道我应该如何设计我的数据库,以便可以有效地搜索它。我应该使用任何特定形式的 SQL 或任何特殊算法来加快搜索速度?虽然如果我的数据库中只有 100 个位置不会有问题,但我可以想象如果我有 10,000 个或更多位置可能会很困难。
使用具有良好多维索引的数据库。这允许数据库进行有效的边界框查询。PostgreSQL 是不错的选择,因为它具有用于边界框查询的 GIST 索引。MySQL 和 MS SQL 具有可接受的功能。
您面临的另一个问题是坐标系的选择。GPS 纬度、长坐标是角度。所以可以选择如何进行距离数学。
1) 将所有纬度、经度转换为笛卡尔 X、Y 坐标 - 这适用于小型(美国州)大小的区域。这需要地图投影函数在纬度、经度和笛卡尔坐标之间进行转换。
2)使用harsine公式http://www.movable-type.co.uk/scripts/latlong.html。但是要小心!因为索引键在纬度,经度。这种选择可能会产生副作用。
PostGIS 是一个 PostgreSQL GIS 应用程序。对于最近点查询来说,它很重,但很有效。
使用 PostGIS