百度地图集成_POi搜索和正反地理编码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了百度地图集成_POi搜索和正反地理编码相关的知识,希望对你有一定的参考价值。
参考技术A POI搜索分好多种,主要以城市内搜索为例讲解:BMKMapView:地图类
BMKPoiSearch :搜索服务类
BMKCitySearchOption :搜索包装的参数类
1.city,所在的城市
2.keyword,搜索的关键字(如美食,酒店等)
3.pageCapacity,搜索的分页数量(默认为10,最多为50)
4.pageIndex,搜索的页码(默认为0)
首先从整体来说:
BMKCitySearchOption 的对象作为包装参数cityOption,通过BMKPoiSearch的对象self.poiSearch调用poiSearchInCity,
BOOL flag =[self.poiSearch poiSearchInCity:cityOption]
之后通过BMKSearchDelegate的onGetPoiResult:方法
告诉用户获得到搜索返回的数组列表,在onGetPoiResult中包装成若干个大头针模型,之后把大头针模型添加到地图上,如:[self.mapView addAnnotations:annotionArray];
分别先后调用了BMKMapViewDelegate 的viewForAnnotation: (目的:根据传过来的annotion生成对应的View)和didAddAnnotationViews: (之后添加到地图上)的2个方法,完成搜索到的信息在地图上展示的功能。
综上:方法调用顺序为poiSearchInCit:------->onGetPoiResult------->viewForAnnotation(每添加一次调用一次)------->didAddAnnotationViews(每添加一次调用一次),最终完成了地图上的Poi(兴趣点)搜索功能。
正向地理编码指的是:告诉地方名称,编码出经纬度
反向地理编码指的是:告诉地理经纬度,编码出地方名称
不要搞混了哦!
BMKMapView:地图类
BMKGeoCodeSearch:地理反地理编码类
BMKGeoCodeSearchOption:地理编码编码参数类
BMKReverseGeoCodeOption:反地理编码编码参数类
1.正向地理编码
1.[self.geoSearch geoCode:geoSearchOption] 触发了正向地理编码
通过BMKGeoCodeSearchDelegate 的onGetGeoCodeResult:方法获得到编码的信息(可以展示),也可以通过[self.mapView addAnnotation:item];调用BMKMapViewDelegate的viewForAnnotation:这个方法,在里面通过大头针模型生成大头针View展示到地图上,完成正向地理编码。
2.反向地理编码
同上:(只是代理方法稍微不同,详见Demo)
获取百度地图POI数据二(准备搜索关键词)
上篇讲到 想要获取尽可能多的POI数据 需要准备尽可能多的搜索关键字 那么这些关键字如何得来呢? 本人使用的方法是通过一些网站来获取这些关键词 http://poi.mapbar.com/这个网站有全国各地的POI数据 对各个城市的POI数据都有归类 我便是从这个网站上面获取了上海市的各个类别的关键词 比如上海市所有的门牌号码 公路名称 地铁名称等等 下面介绍如何获取这些信息
和获取百度POI数据所用的方法一样,都是通过分析这个网站的url然后替换其中的参数获取不同的数据 这个网站的数据分列在不同的类别中
每一个类别都对应一个url 这个可以通过查看网页源码查看
点击对应的url地址就可查看该类别包含的数据 比如查看上海所有中餐馆的名称
输入url http://poi.mapbar.com/shanghai/110/ 就可以看到所有中餐馆数据
当然 这些数据都是分页显示 对url稍作修改就能分页的形式查看数据 http://poi.mapbar.com/shanghai/110_1/ 表示中餐馆数据中的第一页数据 有的数据有多页 有的数据仅有一页 这些餐馆名称便可以当作在百度地图中搜索的关键词 通过程序下载这些网页再借助正则表达式便能够将每个关键词保存下来 要想让程序自动完成整个操作 首先要获取所有类别及其对应的关键词 这个可以通过将网页的html代码下来 自己创建一个网页 再引入jquery 借助jquery强大的选择器 将其中<a>标签的href属性给选取出来
以下是本人获取的所有类别及其url
有了这些数据 那么就可通过程序来完成所有关键词的获取了 以下是程序源码
class Program { static void Main(string[] args) { string hrefInfo = File.ReadAllText(@"C:\\Users\\Administartor\\Desktop\\href.txt",Encoding.Default); List<string> list = hrefInfo.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries).ToList(); DataTable dt = SqlHelper.ExecuteDataTable("select KWName,KWType from SHKW",CommandType.Text); List<string> kwList = new List<string>(); foreach (DataRow row in dt.Rows) { kwList.Add(row["KWName"].ToString()); } foreach (string href_item in list) { StringBuilder sb = new StringBuilder(); string[] href_item_arr = href_item.Split(\',\'); for (int i = 0; i < 1000; i++) { try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(href_item_arr[0].Substring(0,href_item_arr[0].Length-1)+"_"+(i+1)+"/"); request.Method = "GET"; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream responseStream = response.GetResponseStream(); StreamReader sr = new StreamReader(responseStream, Encoding.UTF8); string restring = sr.ReadToEnd(); string[] strArr = restring.Split(new string[] { "<div class=\\"sortC\\">", "<div class=\\"sortPage cl\\" id=\\"pageDiv\\"" }, StringSplitOptions.None); Regex regex = new Regex("<a.*</a>"); MatchCollection collection = regex.Matches(strArr[1]); if (collection.Count == 0) break; foreach (var item in collection) { string[] dataArr = item.ToString().Split(new string[] { ">", "</a>" }, StringSplitOptions.RemoveEmptyEntries); sb.Append(dataArr[1] + ","); } } catch { break; } Console.WriteLine(href_item_arr[1] + " " + (i + 1)+" "+(list.IndexOf(href_item)+1)+"/"+list.Count); }//end for string[] kwArr = sb.ToString().Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); DataTable dataDt = new DataTable(); dataDt.Columns.Add("KWName", typeof(string)); dataDt.Columns.Add("KWType", typeof(string)); dataDt.Columns.Add("SaveTime", typeof(DateTime)); string type=href_item_arr[1].Replace("/", "").Replace("\\\\", ""); foreach (string kw in kwArr) { if (kwList.Contains(kw)) continue; kwList.Add(kw); dataDt.Rows.Add(kw, type, DateTime.Now); } if (dataDt.Rows.Count != 0) { string res = ""; if (SqlHelper.DataTableToDB("SHKW", dataDt)) res = "成功"; else res = "失败"; Console.WriteLine(res + "写入KW" + " " + dataDt.Rows.Count + "个"); } else { Console.WriteLine(type+" 无数据"); } } Console.WriteLine("OK"); Console.ReadKey(); } }
查看数据库保存的关键词的数据
select * from SHKW
select count(*) from SHKW
有了这一百万条关键词的信息 下一步就可以构建获取百度地图POI数据的url了 下篇接着讲解如何获取百度地图的POI数据~
以上是关于百度地图集成_POi搜索和正反地理编码的主要内容,如果未能解决你的问题,请参考以下文章
objective-c开发——地图定位之地理编码和地理反编码
C#语言,从百度地图反向地理编码api返回的json数据中提取信息