如何将世界各地的所有地理位置存储在数据库中?
How to store all geographical locations around the world in Database?
我在一个旅游网站工作,我需要存储游客去过的旅游景点。我需要这些地点在位置 table 中是唯一的,这样我才能知道某个特定地点的受欢迎程度等。
我还需要存储所有国家、州、城市,因为我不能依赖用户输入。
数据库是MySQL。
查看可用于此类位置的数据集,我发现存在跨国家嵌套城市的问题,这些城市可能使用省、州、县等。
所以,我的问题是如何设计模式以便我可以存储所有位置。
我正在考虑为国家、州、城市和地点设置 table。
点 table 将包含 spot_name、cityId、stateId、countryId 和一些具有经度和纬度边界的字段。
这样我就可以通过他们的地理位置识别相同的地点。
但同样,由于 states/provinces/counties 等问题,此解决方案将不起作用。
您能否建议如何构建架构并使用正确的数据为其播种,以便将对用户输入的依赖性降到最低。
您应该使用地理空间数据库,这样您就可以将国家和州等位置存储为空间实体,从而可以正确确定嵌套。
如果您不能使用一个,您可以通过将世界划分为网格,然后递归地细分网格的每个方块,在正常 table 中使用字符串来模拟地理空间位置。
例如把世界分成9个正方形,从左上到右下依次编号为1-9。这些大方块中的任何东西都只有一个数字参考。然后将每个正方形分成 9,任何处于此级别的东西都有一个 2 位数的参考。所以 11 是左上角的方块,99 是右下角的方块。
重复此过程,直到获得所需的精度。单个功能可能有一个 10 位长的参考 5624357899 但你会知道这将在任何更大的功能中,它是更少的数字,以相同的字符串开头,如 5624357。所以你的国家会有更少的数字,因为它们更大,但你的个别位置会更多,因为它们更小且定位更准确。
这只会给你一个大概的位置(并且对长而细的特征不利)但可能足够table
第一个网格将如下所示:
______________________________
| | | |
| 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 |
| | | |
|_________|_________|_________|
你重复这个过程,直到你有足够好的近似值来满足你的目的。
我认为您的问题的架构部分非常简单。但真正的问题是如何让用户的数据达到 select - 你在想象(几乎)不可能!我不认为存在任何可以将坐标转换为地名的数据库。甚至 Google 也不能(还)为您做到这一点 - 例如,搜索 "Lat Long Taj Mahal" 会提供 27.1750、78.0419(Google 用他们自己和其他人的经验告诉您);但是搜索“27.1750, 78.0419”只会在地图上产生一个图钉,然后我们的人眼可以看到图钉 'pretty close' 指向一个名为 "Taj Mahal" 的地方(或印地语中的 ताज महल,或તાજ મહેલ 在古吉拉特语中)...
想象一下 - 您将如何填充您的模式?想一想如果您想要不错的精度(需要至少 6 位小数),您的 table 中需要多少个坐标!谁将是地名的权威?
所以我认为您最好的方法可能是:
- 使用公开可用的 country/city 名字翻译列表
他们的坐标,
- 构建您的应用,使其预填充最接近用户坐标的坐标
精确定位,然后
- 允许用户用自己的(更多
具体)选择地名。
然后您可以存储您的应用程序收集的精确坐标,以及用户指定的地名;并以数百万美元的价格出售数据! (我怀疑 Google 已经在这样做了;)
我在一个旅游网站工作,我需要存储游客去过的旅游景点。我需要这些地点在位置 table 中是唯一的,这样我才能知道某个特定地点的受欢迎程度等。 我还需要存储所有国家、州、城市,因为我不能依赖用户输入。 数据库是MySQL。 查看可用于此类位置的数据集,我发现存在跨国家嵌套城市的问题,这些城市可能使用省、州、县等。
所以,我的问题是如何设计模式以便我可以存储所有位置。 我正在考虑为国家、州、城市和地点设置 table。 点 table 将包含 spot_name、cityId、stateId、countryId 和一些具有经度和纬度边界的字段。 这样我就可以通过他们的地理位置识别相同的地点。
但同样,由于 states/provinces/counties 等问题,此解决方案将不起作用。 您能否建议如何构建架构并使用正确的数据为其播种,以便将对用户输入的依赖性降到最低。
您应该使用地理空间数据库,这样您就可以将国家和州等位置存储为空间实体,从而可以正确确定嵌套。
如果您不能使用一个,您可以通过将世界划分为网格,然后递归地细分网格的每个方块,在正常 table 中使用字符串来模拟地理空间位置。
例如把世界分成9个正方形,从左上到右下依次编号为1-9。这些大方块中的任何东西都只有一个数字参考。然后将每个正方形分成 9,任何处于此级别的东西都有一个 2 位数的参考。所以 11 是左上角的方块,99 是右下角的方块。
重复此过程,直到获得所需的精度。单个功能可能有一个 10 位长的参考 5624357899 但你会知道这将在任何更大的功能中,它是更少的数字,以相同的字符串开头,如 5624357。所以你的国家会有更少的数字,因为它们更大,但你的个别位置会更多,因为它们更小且定位更准确。
这只会给你一个大概的位置(并且对长而细的特征不利)但可能足够table
第一个网格将如下所示:
______________________________
| | | |
| 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 |
| | | |
|_________|_________|_________|
你重复这个过程,直到你有足够好的近似值来满足你的目的。
我认为您的问题的架构部分非常简单。但真正的问题是如何让用户的数据达到 select - 你在想象(几乎)不可能!我不认为存在任何可以将坐标转换为地名的数据库。甚至 Google 也不能(还)为您做到这一点 - 例如,搜索 "Lat Long Taj Mahal" 会提供 27.1750、78.0419(Google 用他们自己和其他人的经验告诉您);但是搜索“27.1750, 78.0419”只会在地图上产生一个图钉,然后我们的人眼可以看到图钉 'pretty close' 指向一个名为 "Taj Mahal" 的地方(或印地语中的 ताज महल,或તાજ મહેલ 在古吉拉特语中)...
想象一下 - 您将如何填充您的模式?想一想如果您想要不错的精度(需要至少 6 位小数),您的 table 中需要多少个坐标!谁将是地名的权威?
所以我认为您最好的方法可能是:
- 使用公开可用的 country/city 名字翻译列表 他们的坐标,
- 构建您的应用,使其预填充最接近用户坐标的坐标 精确定位,然后
- 允许用户用自己的(更多 具体)选择地名。
然后您可以存储您的应用程序收集的精确坐标,以及用户指定的地名;并以数百万美元的价格出售数据! (我怀疑 Google 已经在这样做了;)