如何在数据库中存储世界各地的所有地理位置?

时间:2015-07-22 12:49:22

标签: mysql geolocation database-schema

我在一个旅游网站工作,我需要存放游客前往的旅游景点。我需要斑点在位置表中是唯一的,以便我可以知道特定地点的受欢迎程度等。 我还需要与我一起存储的所有国家,州,城市因为我不能依赖用户输入。 数据库是MySQL。 看到可用于这些地点的数据集,我发现存在一个问题,即各国的城市可能会使用省,州,县等。

所以,我的问题是如何设计架构以便我可以存储所有位置。 我在考虑为国家,州,城市和景点设置桌子。 斑点表将包含spot_name,cityId,stateId,countryId以及一些具有经度和纬度范围的字段。 通过这种方式,我可以通过其地理位置识别相同的点。

但是,由于州/省/县等问题,这个解决方案不会起作用。 您能否建议如何构建模式,并使用正确的数据进行播种,以便最大限度地减少对用户输入的依赖。

2 个答案:

答案 0 :(得分: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    |
|         |         |         |
|_________|_________|_________|

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

答案 1 :(得分:0)

我认为问题的架构部分非常简单。但真正的问题是如何让用户选择数据 - 你想象的(几乎)不可能!我不认为存在任何将坐标转换为地名的数据库。即便谷歌也无法为你做到这一点 - 例如,搜索" Lat Long Taj Mahal"提供27.1750,78.0419(谷歌使用他们自己和其他人的经验告诉你);但搜索" 27.1750,78.0419"只是在地图上产生一个图钉,然后我们的人眼就可以看到图钉非常接近了。到一个名为" Taj Mahal" (或印地语的ताजमहल,或古吉拉特语的તાજ))......

想象一下 - 如何填充您的架构?如果你想要体面的准确度(需要至少6位小数),请考虑你需要多少坐标?谁将成为地名的权威?

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

  1. 使用已公布的国家/城市名称列表进行翻译 对他们的协调,
  2. 构建您的应用,以便预先填充与用户最接近的坐标 精确的位置,然后
  3. 允许用户使用自己的比赛来限定比赛(更多 具体)选择地名。
  4. 然后您可以存储您的应用收集的精确坐标,以及用户指定的地名;并以数百万美元的价格出售数据! (我怀疑谷歌已经这样做了;)