请问,在地图上面添加点,然后调用右键属性去删除那个点位,二次获取到的百度地图经纬度查询有细微的差别,怎么解决?

高德地图sdk分析 - 简书
<div class="fixed-btn note-fixed-download" data-toggle="popover" data-placement="left" data-html="true" data-trigger="hover" data-content=''>
写了37653字,被524人关注,获得了381个喜欢
高德地图sdk分析
高德地图sdk是目前国内使用比较多的地图类sdk(还有百度地图也不错),目前项目中也用到了,但是相关封装还是不够清晰。为了做好这一层封装,首先需要把高德地图sdk研究一下。
高德地图有各种语言版本的sdk,其中iOS的sdk就包含基本sdk、云图sdk,导航sdk。后两个sdk暂时用不到,而基本sdk中又包含2d(栅格地图)和3d(矢量地图)两个版本的库以及搜索的库。今天要分析的就是2d和搜索的framework,最新的sdk版本是2.4.0。
几个核心类说明
地图视图类,sdk中最重要的一个类,用来负责地图的展示,该类直接从UIView继承而来。
1、属性visibleMapRect
self.mapView.visibleMapRect = MAMapRectMake(, , 6656);
它定义了地图的可见范围,如下图所示:
mamap_2.png
我们如果改变visibleMapRect的大小,地图就会显示不同的区域。
2、属性mapType地图类型,有两种类型: 普通地图和卫星地图,我们经常用到的就是普通地图
typedef NS_ENUM(NSInteger, MAMapType)
MAMapTypeStandard,
// 普通地图
MAMapTypeSatellite
// 卫星地图
3、属性showTraffic是否展示路况拥堵信息,默认是不展示的,一般也用不到。
4、属性scrollEnabled和zoomEnabledMAMapView虽然不是UIScrollView,但自身也实现了滚动和缩放功能(UIWebView同理)。这两个属性可以控制缩放和滚动的开关,默认都是打开的。
5、属性logoCenter和logoSize高德的logo位置和大小,这个logo是需要显示出来的,不能隐藏不能遮挡(尊重知识产权)
6、属性showsCompass、compassOrigin、compassSize地图的罗盘是否展示,展示的位置和大小
7、属性showsScale、scaleOrigin、scaleSize地图的比例尺是否展示,展示的位置和大小
8、属性centerCoordinate地图中心点的经纬度,改变它不会影响缩放比例。
9、属性showsUserLocation、userLocation、userTrackingMode是否显示用户位置,用户位置的数据、用户追踪的模式。
10、属性annotations地图上的标注,显示对应位置有什么东西,比较常用。
11、属性overlays地图上的覆盖图形,能够在地图指定位置绘制自定义的图层,比较常用。
12、属性distanceFilter、desiredAccuracy、headingFilter最小更新距离,定位精度,最小更新角度。
13、协议,MAMapViewDelegate,作为一个自定义的视图,当其数据对应数据发生变化时,肯定会有一些函数回调来改变自身。这些方法都被集中在MAMapViewDelegate中。一共有18个方法,大致可以分为4类:地图区域改变、用户位置发生变化、标注的创建和事件响应已经覆盖层的一些逻辑。个人觉得这个协议太大了,不符合接口分离原则 。
AMapSearchAPI
AMapSearchAPI是一个NSObject,代表高德地图的搜索功能。
1、属性timeOut。搜索请求超时时间,默认是20秒。
2、查询接口,不同的查询类型有不同的查询接口。
//POI查询接口函数,即根据 POI 参数选项进行 POI 查询。
- (void)AMapPlaceSearch:(AMapPlaceSearchRequest *)
//路径规划查询接口。
- (void)AMapNavigationSearch:(AMapNavigationSearchRequest *)
//输入提示查询接口。
- (void)AMapInputTipsSearch:(AMapInputTipsSearchRequest *)
//地址编码查询接口。
- (void)AMapGeocodeSearch:(AMapGeocodeSearchRequest *)
//逆地址编码查询接口。
- (void)AMapReGoecodeSearch:(AMapReGeocodeSearchRequest *)
//公交线路查询接口。
- (void)AMapBusLineSearch:(AMapBusLineSearchRequest *)
//公交车站查询接口。
- (void)AMapBusStopSearch:(AMapBusStopSearchRequest *)
3、协议AMapSearchDelegate,包含对各种请求接口成功失败的回调。
可以实现的功能
自定义用户坐标点
如果起用了定位,如下的方法会被调用到,因为自身打点也是一个Annotation,但这个Annotation的类型是MAUserLocation。然后通过设置MAUserLocationRepresentation,就可以将用户坐标点进行自定义。
- (void)mapView:(MAMapView *)mapView didAddAnnotationViews:(NSArray *)views
MAAnnotationView *view = views[0];
// 放到该方法中用以保证userlocation的annotationView已经添加到地图上了。
if ([view.annotation isKindOfClass:[MAUserLocation class]])
MAUserLocationRepresentation *pre = [[MAUserLocationRepresentation alloc] init];
pre.fillColor = [UIColor colorWithRed:0.9 green:0.1 blue:0.1 alpha:0.3];
pre.strokeColor = [UIColor colorWithRed:0.1 green:0.1 blue:0.9 alpha:1.0];
pre.image = [UIImage imageNamed:@"location.png"];
pre.lineWidth = 3;
pre.lineDashPattern = @[@6, @3];
[self.mapView updateUserLocationRepresentation:pre];
view.calloutOffset = CGPointMake(0, 0);
缩放和滚动有属性直接控制,单击双击也能够支持,但是为了和AnnotationView进行区分,需要用下面的方法进行过滤。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
浮层对象是遵循MAOverlay协议的对象,可以是圆、折线和多边形。在高德sdk中,MACircle、MAPolyline、MAPolygon都是浮层对象。然后通过
- (void)addOverlays:(NSArray *)
将浮层对象添加到MapView中。
自定义浮层
可以自定义浮层对象,只要符合MAOverlay协议即可。然后在绘制图层的代理方法中
- (MAOverlayRenderer *)mapView:(MAMapView *)mapView viewForOverlay:(id &MAOverlay&)overlay
子类话一个MAOverlayRenderer并返回,该子类只要重写方法
- (void)drawMapRect:(MAMapRect)mapRect zoomScale:(MAZoomScale)zoomScale inContext:(CGContextRef)context
该方法就如果UIView的drawRect,可以随心所欲的在上面画任何东西。
Overlay可以直接贴图,使用MAGroundOverlay类。虽然这个功能用自定义Overlay的方式也能实现,但比较麻烦。用MAGroundOverlay就很简单。
Overlay还支持大地曲线:MAGeodesicPolyline,图片tiles:MATileOverlay。
Annotaion就是在地图上标记一个位置,然后展示出来。展示的视图就是用MAAnnotationView。像MapView插入Annotation的方法是:
- (void)addAnnotation:(id &MAAnnotation&)
类似UITableView,MAAnnotationView的创建实在代理方法中实现的。
- (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id&MAAnnotation&)annotation
MAAnnotationView可以自定义,可以有更好的显示效果;Annotation还支持动画,让显示的点动起来。
POI(Point of Interest),信息点,一家餐馆就是一个信息点。POI搜索可以根据ID、关键字、中心点搜索周边、指定范围搜索等搜索方式来满足不同的需求。代码如下:
/* 根据ID来搜索POI. */
- (void)searchPoiByID
AMapPlaceSearchRequest *request = [[AMapPlaceSearchRequest alloc] init];
B000A80WBJ
B00141IEZK
B000A876EH
B000A7O1CU
request.searchType
= AMapSearchType_PlaceID;
request.uid
= @"B000A07060";
request.requireExtension
[self.search AMapPlaceSearch:request];
/* 根据关键字来搜索POI. */
- (void)searchPoiByKeyword
AMapPlaceSearchRequest *request = [[AMapPlaceSearchRequest alloc] init];
request.searchType
= AMapSearchType_PlaceK
request.keywords
= @"肯德基";
request.city
= @[@"010"];
request.requireExtension
[self.search AMapPlaceSearch:request];
/* 根据中心点坐标来搜周边的POI. */
- (void)searchPoiByCenterCoordinate
AMapPlaceSearchRequest *request = [[AMapPlaceSearchRequest alloc] init];
request.searchType
= AMapSearchType_PlaceA
request.location
= [AMapGeoPoint locationWithLatitude:39.990459 longitude:116.481476];
request.keywords
= @"餐饮";
/* 按照距离排序. */
request.sortrule
request.requireExtension
/* 添加搜索结果过滤 */
AMapPlaceSearchFilter *filter = [[AMapPlaceSearchFilter alloc] init];
filter.costFilter = @[@"100", @"200"];
filter.requireFilter = AMapRequireG
request.searchFilter =
[self.search AMapPlaceSearch:request];
/* 在指定的范围内搜索POI. */
- (void)searchPoiByPolygon
NSArray *points = [NSArray arrayWithObjects:
[AMapGeoPoint locationWithLatitude:39.990459 longitude:116.481476],
[AMapGeoPoint locationWithLatitude:39.890459 longitude:116.581476],
AMapGeoPolygon *polygon = [AMapGeoPolygon polygonWithPoints:points];
AMapPlaceSearchRequest *request = [[AMapPlaceSearchRequest alloc] init];
request.searchType
= AMapSearchType_PlaceP
request.polygon
request.keywords
= @"Apple";
request.requireExtension
[self.search AMapPlaceSearch:request];
输入提示查询
AMapInputTipsSearchRequest *tips = [[AMapInputTipsSearchRequest alloc] init];
tips.keywords = @"关键字";
[self.search AMapInputTipsSearch:tips];
输入提示回调
- (void)onInputTipsSearchDone:(AMapInputTipsSearchRequest *)request response:(AMapInputTipsSearchResponse *)response
[self.tips setArray:response.tips];
[self.displayController.searchResultsTableView reloadData];
搜索地理编码
AMapGeocodeSearchRequest *geo = [[AMapGeocodeSearchRequest alloc] init];
geo.address =
if (adcode.length & 0)
geo.city = @[adcode];
[self.search AMapGeocodeSearch:geo];
地理编码回调,得到一个地点的经纬度信息
- (void)onGeocodeSearchDone:(AMapGeocodeSearchRequest *)request response:(AMapGeocodeSearchResponse *)response
逆地理编码
逆地理编码与地理编码正好相反,是通过经纬度来查询文字描述的位置信息。发起逆地理编码查询
AMapReGeocodeSearchRequest *regeo = [[AMapReGeocodeSearchRequest alloc] init];
regeo.location = [AMapGeoPoint locationWithLatitude:coordinate.latitude longitude:coordinate.longitude];
regeo.requireExtension = YES;
[self.search AMapReGoecodeSearch:regeo];
逆地理编码回调
- (void)onReGeocodeSearchDone:(AMapReGeocodeSearchRequest *)request response:(AMapReGeocodeSearchResponse *)response
if (response.regeocode != nil)
CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(request.location.latitude, request.location.longitude);
ReGeocodeAnnotation *reGeocodeAnnotation = [[ReGeocodeAnnotation alloc] initWithCoordinate:coordinate
reGeocode:response.regeocode];
[self.mapView addAnnotation:reGeocodeAnnotation];
除了以上的搜索,还有导航、搜索公交路线、公交站,这些再一般的应用中不会用到,就不介绍了。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
从0到1,折腾产品;你的产品,我有话说
· 6965人关注
我的苹果开发之路
· 79人关注
产品经理相关经典文章
· 2人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:请问如何在百度地图API中获取鼠标单击点的坐标_百度地图api吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:5,365贴子:
请问如何在百度地图API中获取鼠标单击点的坐标收藏
请问如何在百度地图API中获取鼠标单击点的坐标,谢谢
野狗实时数据同步SDK用于实时物流,交通出行等应用,可实现实时定位和实时消息推送.按需付费,0元试用.即将与高德合作推出下一代实时地图SDK. 注册野狗即可提前试用.
不是我不帮你解决,是这里发不了源代码....... //单击地图给地图添加标注并在文本显示经纬度map.addEventListener("click", function (e) {
alert(e.point.lng+ e.point.)});那个e.point.lng, e.point.lat就是经纬度了
map.addEventListener("click", function(e){
$("txtGeoLng").value=e.point.
$("txtGeoLat").value=e.point.
$("lblPosition").innerHTML=("当前位置:" + e.point.lng + ", " + e.point.lat);
map.addEventListener("dragend", function(e){
$("txtGeoLng").value=e.point.
$("txtGeoLat").value=e.point.
$("lblPosition").innerHTML=("当前位置:" + e.point.lng + ", " + e.point.lat);
楼主,请问您这个程序最后写出来了嘛?是怎么弄的
请问有代码吗
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或后使用快捷导航没有帐号?
暂时没有人问过相似的问题,你可以做第一个提问题的人
查看: 7021|回复: 10
百度导航sdk点击地图获取经纬度
请问,在百度导航sdk中,点击地图时怎么获取经纬度,发起路径计算进行导航时只能用,从而只能MapViewListener这个类来监听地图点击事件,它的方法不能像百度地图BaiduMap的onMapClick一样,每次都可以获取到经纬度,我试了一下,用BaiduMap规划路径,导航没法进行,提示没有计算好路径。我想在百度导航中每次点击地图时都能获取到经纬度,请问一下怎么做??谢谢。
关注... 也想知道这样的问题怎么样实现
百度的工程师 就没一个可以回答这个问题么?!! 显然是回避这个问题了???
您好,百度导航可以获取到经纬度信息,参见 getLongitude()和getLatitude()
& && &getLongitude()和getLatitude()是已知具体点对象时来获取经纬度,我的问题是在百度Android导航sdk1.1.0中点击地图任意点获取获取它经纬度,在百度地图SDK中BaiduMap提供了setOnMapClickListener和public void onMapClick(LatLng point) 接口,point.getLongitude()自然可以获取到 经纬度,但是在Android导航sdk1.1.0中,用于路径规划的是MapGLSurfaceView,那么问题是:MapGLSurfaceView没有类似setOnMapClickListener和public void onMapClick(LatLng point) 接口,只提供了MapViewListener,无法实现点击地图任意点获取获取该点的LatLng 对象,从而也就无法获取经纬度。
所有开放接口在API文档中可以查找,
Sizhu_Gu & && &在API文档里并没有找到类似的方法,所以才来求助。。。。不知道贵司的相关工程师是否清楚有没有类似的方法,或者说在使用MapGLSurfaceView时,暂时不支持点击任意地图获取经纬度???
麻烦楼主,问题解决没?我也遇到这个问题,跪求解答,谢谢。
我也遇到了这个问题,楼主解决了可以分享一下吗?呼唤楼主。
& &我在导航工程中加入定位SDK包,并使用定位SDK得来我的经纬度信息,但是编译的时候无法通过,请问您找到方法了吗
你好,对于反GEO的应用,可以考虑使用地图SDK的接口,把获取到的经纬度信息和坐标系作为参数传入导航SDK的接口,进行路线规划和导航。
Powered by

我要回帖

更多关于 右键菜单按钮调用出错 的文章

 

随机推荐