转换或使用北,东,南和西的coords到东北和西南以检查入境

时间:2012-09-11 17:06:30

标签: mysql coordinates bounds

我有两张桌子,一张桌子包含各个国家的北,东,南,西三角形的国家,这是结构,

+--------------+----------------------+------+-----+---------+----------------+
| 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),

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

| boundary_id |国家| country_code | geo_west | geo_north | geo_south | geo_east | + ------------- + ---------------- -------------- + - + ---------- + ------------ + ------------ + ------------- + | 218 |阿富汗| AF | 60.478436 | 38.483425 | 29.377470 | 74.879463 | | 224 |阿尔巴尼亚| AL | 19.293968 | 42.665615 | 39.648354 | 21.068476 | | 188 |阿尔及利亚| DZ | -8.673869 | 37.093727 | 18.960026 | 11.979549 | | 229 |美属萨摩亚| AS | -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 |
+---------+-----------+-----------+

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

由于限制,我更愿意避免地理定位服务。

3 个答案:

答案 0 :(得分:1)

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

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

如果像对待矩形一样处理国家,你会如何处理所有重叠?

答案 1 :(得分:0)

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

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

  1. 在线查找国家边界多边形的来源(谷歌搜索可能会让你大部分时间都在这里)
  2. 将这些多边形加载到MySQL中并将它们存储为空间要素(几何对象,而不仅仅是基本坐标字符串)
  3. 将您的用户位置存储为空间要素
  4. 使用MySQL的spatial relation functions来确定用户(点)是否在国家/地区内(多边形)
  5. 如果这是你想要的路径,你应该考虑转移到http://gis.stackexchange.com

答案 2 :(得分:0)

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

准备这个位图可能会有很多工作,但一旦完成,休息应该很容易。

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