1

我有两张表,一张表包含国家的北、东、南和西坐标,每个国家都有一个矩形,这是结构,

+--------------+----------------------+------+-----+---------+----------------+
| Field        | Type                 | Null | Key | Default | Extra          |
+--------------+----------------------+------+-----+---------+----------------+
| boundary_id  | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |
| country      | varchar(100)         | NO   |     | NULL    |                |
| country_code | varchar(4)           | NO   |     | NULL    |                |
| geo_west     | float(10,6)          | NO   |     | NULL    |                |
| geo_north    | float(10,6)          | NO   |     | NULL    |                |
| geo_south    | float(10,6)          | NO   |     | NULL    |                |
| geo_east     | float(10,6)          | NO   |     | NULL    |                |
+--------------+----------------------+------+-----+---------+----------------+

现在,对于另一个表存储用户的位置,我需要他们的位置(纬度和经度)与表匹配,以检查他们是否属于所选的所需国家。换句话说,只选择落在所选国家范围内的用户。

这是表格中的数据(选择4),

+-------------+----------------+--------------+-------------+------------+------------+-------------+

| 边界标识 | 国家 | 国家代码 | geo_west | geo_north | geo_south | geo_east | +-------------+----------------+--------------+--- ----------+------------+------------+------------- + | 218 | 阿富汗 | 自动对焦 | 60.478436 | 38.483425 | 29.377470 | 74.879463 | | 224 | 阿尔巴尼亚 | 铝 | 19.293968 | 42.665615 | 39.648354 | 21.068476 | | 188 | 阿尔及利亚 | DZ | -8.673869 | 37.093727 | 18.960026 | 11.979549 | | 229 | 美属萨摩亚 | 作为 | -170.841339 | -14.162115 | -14.382480 | -169.416061 | +-------------+----------------+--------------+--- ----------+------------+------------+------------- +

用户表,

+---------+-----------+-----------+
| user_id | latitude  | longitude |
+---------+-----------+-----------+
|       6 | 51.495010 | -0.071583 |
|       7 | 51.204731 |  1.251486 |
|       8 | 51.261860 |  1.327887 |
|       9 | 51.487850 | -0.071926 |
|      10 | 51.498699 | -0.201187 |
|      11 | 51.436462 | -0.100937 |
|      12 | 51.331093 |  0.829124 |
|      13 | 51.565121 | -0.065918 |
|      14 | 51.493568 | -0.248566 |
+---------+-----------+-----------+

我是否需要将坐标转换为东北和西南以及如何有效地匹配这些?

由于其局限性,我更愿意避免使用地理定位服务。

4

3 回答 3

1

您可能应该为此使用某种地理定位服务(即谷歌地图)。仅仅知道一个国家的最北端、最南端等坐标并不意味着这个国家的形状。

例如,美国最北端的坐标(阿拉斯加)、最南端和最西端的坐标(夏威夷)和最东端(缅因州)将绘制一个巨大的矩形,其中还可能包括加拿大、墨西哥、加勒比海等大片地区。

如果将国家/地区视为矩形,您将如何处理所有重叠?

于 2012-09-11T17:13:16.607 回答
0

只是一个想法...获取包含世界地图的 360x360 位图。在 RGB 中用不同的颜色绘制每个国家,例如,#010000 用于 id 1 国家,#020000 用于 id 2 国家等(是的,除了水,整个世界都会以红色阴影结束)。然后当你想检查一个用户时,取 xy 像素(记住,它会从 -180 到 +180,所以它实际上是 x+180,y+180),找到那个像素的颜色,然后国家 ?

准备那个位图可能需要做很多工作,但是一旦完成,休息应该很容易。

正如我所说,只是一个想法。

于 2012-09-11T17:23:49.063 回答
0

@Mike Brant 刚刚描述了我要提出的要点。

MySQL 支持空间数据类型,所以我建议您采用以下方法:

  1. 在线查找国家边界多边形的来源(谷歌搜索可能会让您大部分时间到达那里)
  2. 将这些多边形加载到 MySQL 中并将它们存储为空间特征(几何对象,而不仅仅是基本坐标字符串)
  3. 将您的用户位置存储为空间特征
  4. 使用 MySQL 的空间关系函数来判断一个用户(点)是否在一个国家(多边形)内

如果这是您想要采取的路径,您应该考虑转到http://gis.stackexchange.com

于 2012-09-11T17:20:54.533 回答