方案1
通过GEO HASH,抓取每个格子里的点的地址信息,然后把这个地址信息作为GEO中点坐标的一个信息,当查询给定经纬度是在哪个城市的时候,查询过程是查询距离这个经纬度最近的带有地址的点,认为给定经纬度和最近的这个点是同一个地址下的。通过不断完善GEO中的每个坐标下的地址信息,可以提高整个系统的精度。这种方法相当于一种间接获取的方法的。
方案2
我们知道每个地区是有一定区域的,可以认为是一个闭合的多边形,定位城市,可以理解为判断某个点,是否在某个区域内。
第一点:如何获取城市的区域边界
很幸运的是百度地图提供了这样的API


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>获取地区轮廓线</title> <script type="text/javascript" src="http://api.map.baidu.com/api?v=1.3"> </script> <style type="text/css"> body{ font-size:13px;margin:10px} #container{ width:800px;height:500px;border:1px solid gray} </style> </head> <body> <div id="container"></div> <br /> 输入省、直辖市或县名称:<input type="text" id="districtName" style="width:80px" value="重庆市"> <input type="button" onclick="getBoundary()" value="获取轮廓线"> <script type="text/javascript"> var map = new BMap.Map("container"); map.centerAndZoom(new BMap.Point(116.403765, 39.914850), 5); map.addControl(new BMap.NavigationControl({type: BMAP_NAVIGATION_CONTROL_SMALL})); map.enableScrollWheelZoom(); function