检查给定位置(lat,lng)是否在城市范围内,而无需调用Google Map API

时间:2014-10-03 01:40:44

标签: location geocoding

我们正在为美国的一些主要城市(例如纽约,芝加哥,洛杉矶)开展位置感知项目。在任何给定的秒内,接近50-60个请求到我们的服务器,每个请求都有用户的当前位置,如果用户的位置在我们支持的城市内,我们希望返回不同的结果。

目前,我们正在使用Google Map GeoCoding来确定某个位置是否在City内,并将这些结果缓存到我们的数据库中,我知道这不是最佳选择。

我是否有任何开放数据可以帮助我们确定城市边界,我们可以简单地使用编程逻辑来检查给定位置是否在城市边界内。

由于 詹姆斯

1 个答案:

答案 0 :(得分:2)

如果您希望拥有内部解决方案,因此没有第三方API调用,您始终可以选择将当前数据库扩展为空间"意识到"。对于PostgreSQL(例如),毫无疑问这将是PostGIS。

PostgreSQL中的一个粗略的关键是将你感兴趣的城市捕捉到单独的2D WKT(着名文本)多边形对象中。您应该创建一个包含所有这些多边形的几何列的表,最好是SRID为4326。

下一步是找出给定用户点(lat / lng)所在的多边形。为此,您可以使用简单要素函数ST_Intersects来确定给定的lat / lng坐标是否在某个多边形内。

在PostgreSQL / PostGIS中,这样的查询看起来与此类似:

 
SELECT city_name 
  FROM our_cities
  WHERE ST_Intersects(ST_GeomFromText('POINT(10.169113 135.154678)', 4326), city_geom);

在这里,我从名为our_cities的表格中选择城市名称。此表将几何数据与其他属性(例如城市名称)一起保存。 WHERE子句包含使用ST_Intersects函数的实际空间查找。

我首先将给定的lat / lng坐标转换为几何,使用另一个名为ST_GeomFromText的简单要素函数,我将POINT对象和正确的SRID提供给它。接下来,我将其与名为city_geom的列进行比较,该列是our_cities表中的实际多边形几何。

这里唯一困难的部分确实是捕获足够高分辨率(点数)的多边形以用于空间查找。一些城市确实提供边界信息作为开放数据,但可能的警告可能是这个信息是所谓的UTM投影(而不是基本的墨卡托投影)。 UTM是一种更加本地化的投影,可以产生更准确的结果。但这一切都值得拥有自己的主题。

其他数据库(如MySQL(MariaDB)或Oracle)的大多数空间扩展应遵循相同的空间标准(WKT / WKB / Simple Features / ...),因此应使用相同的空间对象和函数名称。

修改:经过一些调查后,您可以从Natural EarthGADM等来源获取相当详细的数据,如these等答案中所述。请记住,大多数这些数据源可能并不总是用于商业目的。您还可以在Map Technica等网站上购买更详细的数据,或者您可以查看美国政府自己的Tiger数据。