我们正在为美国的一些主要城市(例如纽约,芝加哥,洛杉矶)开展位置感知项目。在任何给定的秒内,接近50-60个请求到我们的服务器,每个请求都有用户的当前位置,如果用户的位置在我们支持的城市内,我们希望返回不同的结果。
目前,我们正在使用Google Map GeoCoding来确定某个位置是否在City内,并将这些结果缓存到我们的数据库中,我知道这不是最佳选择。
我是否有任何开放数据可以帮助我们确定城市边界,我们可以简单地使用编程逻辑来检查给定位置是否在城市边界内。
由于 詹姆斯
答案 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 Earth或GADM等来源获取相当详细的数据,如these等答案中所述。请记住,大多数这些数据源可能并不总是用于商业目的。您还可以在Map Technica等网站上购买更详细的数据,或者您可以查看美国政府自己的Tiger数据。