根据经纬度查询地名,

来源:互联网 发布:淘宝卖家无货 投诉 编辑:程序博客网 时间:2024/04/28 20:34

就是车辆卫星定位时,客户不用打开地图,就能知道车辆的地点,
就是根据经纬度获取地名的问题,
比如 读得地名:“广西省南宁市武鸣”
或者读得地名:“广西省南宁火车站”
或者读得地名:“广西省南宁友爱路宾华酒店”

这个很麻烦,
但分析一下,也就不是很麻烦了,
平面地图分三种图形:点、线、面
所以做三种测试就行:
1. 是否落在点上(或者点的周围)
2. 是否落在线上(或者线的左右)
3. 是否落在面上

第一步:点的测试,就是寻找 经纬度 最临近的点,

采用两点间坐标来测试的方式,但是全国的地名数量巨大,
一个一个测试速度存在问题,那如何优化呢?
那就是让测试的点尽可能少,但又要准确。
这里可以采用逐级搜索的方式,逐级搜索,
就是根据 经纬度 指定一个范围,在这个范围内搜索,没有搜索出结果,
再放大范围,这样一步一步放大。而范围的确定,却是靠经验值,
总之,准则是“测试的点尽可能少,而且不能遗漏”

第二步:线的测试

寻找 经纬度 最临近的线,

这里先要了解 地图 是如何表示线的,
因为 地图里的线,通常都是曲线,比如 公路、铁路、河流 等.
所以地图 是通过很多个连续的线段 来连接成一条线的,
线是由线段组成,所以存储 线段 的两个点坐标就行了。

线的测试,和点的测试一样,
先测试某一条线,
因为线是由很多线段组成,所以需要求落点与这些线段的垂直距离,
然后取得该线的所有线段中的最小的垂直距离。
这样计算出每一条线的最小垂直距离,
再对这些线的 最小垂直距离 进行比较,取最小值

线的测试也需要优化,
优化需要分两步,
第一步优化,就是从所有线中筛选指定范围的线,
只测试指定范围内的线,如果指定范围内没有线,再将范围扩大,扩大搜索,
第二步是同一条线寻找最小垂直距离的优化,
从这一条线中,筛选指定范围内的线段,只测试这些范围内的线段,
不在这个范围内的不做测试,

因为第二步是基于第一步的,所以第二步可以不做范围扩大,而是一次搜索就行。

第三步:是面的测试

其实面的测试是最先要做的,但考虑难度问题,从简到难,
所以第三步才说面的测试。

面的表示,与线是一样的,面就是描绘出面的轮廓就行了,
而面的轮廓,就是线。
面的测试,就是要测试是在面“里”还是“外”。