将北、东、南和西坐标转换或使用东北和西南坐标来检查入站

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 关于矩形和重叠的观点。我用更简单的建议更新了我的答案

以上是关于将北、东、南和西坐标转换或使用东北和西南坐标来检查入站的主要内容,如果未能解决你的问题,请参考以下文章

使用磁航向获取地理方向

ios获取地图画面中东北和西南的坐标

使用地图坐标确定点是不是在矩形中

如何在地理坐标中获取 WorldWind 地球的边界

地图应用程序 - 在 MongoDB 中存储坐标的最佳方式

direction and position 方向和位置