如何将全球所有地理位置存储在数据库中?
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 中?
在 Bamboo 中,如何将组件库存储库拉到固定位置以避免每个分支重复?