将北、东、南和西坐标转换或使用东北和西南坐标来检查入站
Posted
技术标签:
【中文标题】将北、东、南和西坐标转换或使用东北和西南坐标来检查入站【英文标题】:Convert or use north, east, south and west coords to north-east and south-west for checking in-bounds 【发布时间】:2012-09-11 17:06:29 【问题描述】:我有两张表,一张表包含国家的北、东、南、西坐标,每个国家都有一个矩形,这是结构,
+--------------+----------------------+------+-----+---------+----------------+
| 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 |
+---------+-----------+-----------+
我是否需要将坐标转换为东北和西南以及如何有效地匹配这些?
由于其局限性,我更愿意避免使用地理定位服务。
【问题讨论】:
【参考方案1】:您可能应该为此使用某种地理定位服务(即 Google 地图)。仅仅知道一个国家的最北、最南等坐标并不意味着该国家的形状。
例如,美国最北端的坐标(阿拉斯加)、最南端和最西端的坐标(夏威夷)以及最东端(缅因州)将绘制一个巨大的矩形,其中还可能包括加拿大、墨西哥、加勒比海的大片区域,等等
如果将国家/地区视为矩形,您将如何处理所有重叠?
【讨论】:
我更喜欢避免使用地理定位服务,其中很多都有限制。【参考方案2】:只是一个想法...获取包含世界地图的 360x360 位图。在 RGB 中用不同的颜色绘制每个国家,例如,#010000 用于 id 1 国家,#020000 用于 id 2 国家等(是的,除了水,整个世界都会以红色阴影结束)。然后当你想检查一个用户时,取 x-y 像素(记住,它会从 -180 到 +180,所以它实际上是 x+180,y+180),找到那个像素的颜色,然后国家?
准备该位图可能需要做很多工作,但一旦完成,休息应该很容易。
正如我所说,只是一个想法。
【讨论】:
为了获得更好的分辨率,向上缩放地图并相应地缩放长/纬度值,应该是微不足道的。 这是一种有趣的方法,但它给人一种重新发明***的感觉......有非常令人印象深刻的开源产品可以做到这一点,而且还有很多 BurningtheCodeigniter 很好,你的问题是关于 long/lat 所以我有点假设你是。国家等。@tomfumb 你可能是对的。正如我所说,只是一个想法。【参考方案3】:@Mike Brant 刚刚描述了我要提出的要点。
mysql 支持空间数据类型,所以我建议你采取以下方法:
-
在线查找国家边界多边形的来源(谷歌搜索可能会帮助您了解大部分情况)
将这些多边形加载到 MySQL 中并将它们存储为空间特征(几何对象,而不仅仅是基本坐标字符串)
将您的用户位置存储为空间特征
使用 MySQL 的 spatial relation functions 来确定用户(点)是否在一个国家(多边形)内
如果这是你想走的路,你应该考虑转移到http://gis.stackexchange.com
【讨论】:
我从这里得到了坐标,geognos.com/api/en/countries/info/all.html @BurningtheCodeigniter 数字可能是正确的,但您的顺序错误。 -14.38 将是南边界 @BurningtheCodeigniter 也请告诉我您没有手动输入所有这些数字!将 .html 扩展名更改为 .json 会给出可解析的响应,如果您搜索美属萨摩亚,则会显示纵坐标和它们所指的边界。 geognos.com/api/en/countries/info/all.json 哈哈,幸运的是我没有,我解析的是 JSON 而不是解析 HTML,我用值更新了表格,现在我该怎么办? @BurningtheCodeigniter 老实说,我认为您唯一可行的选择是采取不同的方法。重新阅读 Mike Brant 关于矩形和重叠的观点。我用更简单的建议更新了我的答案以上是关于将北、东、南和西坐标转换或使用东北和西南坐标来检查入站的主要内容,如果未能解决你的问题,请参考以下文章