Rya*_*zel 10 algorithm geolocation
我需要一个免费的(开源)解决方案,给出lat/lng可以返回壁橱城市/州或邮编.mysql不是一个选项,如果可能的话,小型轻量级数据库将是最好的.
更新:没有网络服务,即使是最小的插件也会每天带来5000万次展示,因此添加服务请求会占用响应时间.我不希望在请求上添加超过200毫秒.
我在csv中有数据库,lat/lon/zip/city/state它只是如何存储,更重要的是如何最快地检索它.
Jam*_*s D 10
这是一个非常有趣的问题,答案很复杂.
你提到一个有纬度/经度的城市数据库,但是城市不是单点,这可以在人口密集的地区产生很大的不同,城市A的大部分地区可能更靠近城市B的"中心"而不是城市的中心.城市A.在一个被较小郊区包围的大城市.大城市的外围部分可能更靠近郊区的中心,而不是大城市的中心.捕捉到最近的市中心意味着地图是城市中心点的Voronoi图.这样的地图看起来不像是城市地区的实际地图.
如果你想知道给定纬度/经度的城市和状态,你需要查询一个合适的地图并在多边形测试中指出它是什么.这听起来计算成本很高,但实际上并不坏你使用适当的空间索引,并在编码时要小心.我运行一个销售此访问和其他地理查询的API访问的网站,我们的底层引擎(用Java编写)可以返回美国的包含或最近的城市,平均查询时间为3e-4秒(超过3,000个查询)每秒).
即使我们正在销售它,我很乐意解释它是如何工作的,因为从我们这里购买它比自己制造它更便宜,即使有说明也是如此.所以他们在这里:
就是这样.我打造和关闭这个系统大约半年.我的估计是,其中至少有三个月的严格编码,这是熟悉该主题的人(因此,请注意,如果您正在做出购买或构建决策).
蛮力:将所有数据预加载到阵列中.计算当前点与数组中每个点之间的距离(有一种方法可以使用线性代数而不是触发函数进行此计算,但我不记得是什么随意)来找到最近的点.
请在向下投票之前阅读这篇文章:有很多方法可以加快像这样的暴力搜索,但我发现他们通常不值得这么麻烦.我不仅在使用此方法之前从纬度/经度找到最近的拉链,我已经在Windows Mobile应用程序中使用它(处理能力不是很强大)并且仍然实现了亚秒级搜索时间.只要您避免使用trig函数,这不是一个昂贵的过程.
更新:您可以通过将您的zip数据分配到子区域(象限,例如西北,东南等)并使用每个数据点保存区域ID来加快搜索时间.然后,在搜索中,首先确定当前位置所在的区域,并仅与这些数据点进行比较.
为了避免边界错误(例如当您的当前位置靠近其区域的边缘但实际上最接近相邻区域中的zip时),您的区域应该在某种程度上重叠.这意味着您的一些zip记录将被复制,因此您的整体数据集将会更大一些.