如何将全球所有地理位置存储在数据库中?

Posted

技术标签:

【中文标题】如何将全球所有地理位置存储在数据库中?【英文标题】:How to store all geographical locations around the world in Database? 【发布时间】:2015-07-22 12:49:21 【问题描述】:

我在一个旅游网站工作,我需要存储游客去过的旅游景点。我需要这些地点在位置表中是唯一的,以便我可以知道特定地点的受欢迎程度等。 我还需要与我一起存储的所有国家、州、城市,因为我不能依赖用户输入。 数据库是 mysql。 查看可用于此类位置的数据集,我发现存在跨国家/地区嵌套城市的问题,可能使用省、州、县等。

所以,我的问题是如何设计架构以便我可以存储所有位置。 我正在考虑为国家、州、城市和地点设置表格。 spot 表将包含 spot_name、cityId、stateId、countryId 和一些具有经度和纬度界限的字段。 这样我就可以通过它们的地理位置识别相同的地点。

但同样,由于州/省/县等问题,此解决方案将不起作用。 您能否建议如何构建架构并使用正确的数据为其播种,以便对用户输入的依赖最小化。

【问题讨论】:

将纬度/经度视为唯一标识符有时会给您带来麻烦。例如,在一栋多层建筑中,一楼可能有一家企业,二楼可能有另一家企业。即使是像 Facebook 这样的大公司,他们的地理数据库中也存在重复的地点、不准确的数据等。 我不需要为具有相似坐标的地点(例如同一建筑物中的楼层)设置唯一位置。我需要白宫、尼亚格拉瀑布等地方的独特景点,即城市/城镇内的景点等 【参考方案1】:

您应该使用地理空间数据库,因为这样您就可以将国家和州等位置存储为空间实体,从而可以正确确定嵌套。

如果您不能使用一个,您可以使用普通表格中的字符串来模拟地理空间位置,方法是将世界划分为一个网格,然后递归地细分网格的每个正方形。

例如将世界划分为 9 个正方形,从左上角到右下角编号为 1-9。这些大方块中的任何东西都只有一个数字参考。然后将每个正方形分成 9,并且在这个级别的任何东西都有一个 2 位数的参考。所以 11 是左上角的正方形,而 99 是右下角的正方形。

重复此过程,直到获得所需的精度。单个要素可能具有 10 位长的参考 5624357899,但您会知道这将在任何较大的要素内,该要素的数字较少,以相同的字符串开头,如 5624357。因此,您的国家/地区的数字会更少,因为它们更大,但您的个别位置会更多,因为它们更小且位置更准确。

这只会给你一个大致的位置(并且对于长而细的特征会很糟糕)但可能足够合适

第一个网格如下所示:

______________________________
|         |         |         |
|    1    |    2    |    3    |
|         |         |         |
|_________|_________|_________|
|         |         |         |
|    4    |    5    |    6    |
|         |         |         |
|_________|_________|_________|
|         |         |         |
|    7    |    8    |    9    |
|         |         |         |
|_________|_________|_________|

第二轮看起来像这样(为简单起见,只完成了第一个正方形):

______________________________
|11|12 |13|         |         |
|---------|    2    |    3    |
|14|15 |16|         |         |
|---------|         |         |
|17|18 |19|         |         |
|_________|_________|_________|
|         |         |         |
|    4    |    5    |    6    |
|         |         |         |
|_________|_________|_________|
|         |         |         |
|    7    |    8    |    9    |
|         |         |         |
|_________|_________|_________|

你重复这个过程,直到你有足够好的近似值来满足你的目的。

【讨论】:

【参考方案2】:

我认为您的问题的架构部分非常简单。但真正的问题是如何获取数据供用户选择 - 您正在想象(几乎)不可能!我认为没有任何数据库可以将坐标转换为地名。甚至谷歌也不能(还)为你做到这一点——例如,搜索“Lat Long Taj Mahal”会提供 27.1750、78.0419(谷歌已经用他们自己和其他人的经验告诉你);但是搜索“27.1750, 78.0419”只会在地图上产生一个图钉,然后我们的肉眼可以看到该图钉“非常接近”一个名为“泰姬陵”的地方(或印地语中的 ताज महल,或 તાજ મહેલ在古吉拉特语)...

想象一下 - 您将如何填充您的架构?想一想如果您想要获得不错的准确性(至少需要 6 个小数位),您的表格中需要多少个坐标!谁将是地名的权威?

所以我认为你最好的方法可能是:

    使用已翻译的国家/城市名称的公开可用列表 到他们的坐标, 构建您的应用程序,使其预填充最接近用户的坐标 精确定位,然后 允许用户使用自己的匹配(更多 具体)选择的地名。

然后您可以存储您的应用收集的精确坐标以及用户指定的地名;并以数百万美元的价格出售数据! (我怀疑 Google 已经在这样做了;)

【讨论】:

琐事:纬度和经度的小数点后 4 位为您提供至少 16 米/52 英尺的分辨率。 (我无法说明 Google 数字的准确性。)

以上是关于如何将全球所有地理位置存储在数据库中?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 url 重写将位置数据存储在我的 asp.net 站点上所有页面的 url 中?

roblox 中的单独位置数据存储如何工作?

如何在 Nodejs 中查找所有用户的 geoip 位置

在 Bamboo 中,如何将组件库存储库拉到固定位置以避免每个分支重复?

如何在VBScript中的同一字符串的两个索引位置之间存储所有文本?

如何比较两个位置