ios 百度地图怎么在大头针上加view

ios 百度地图怎么在大头针上加view,第1张

我建议你先把百度地图sdk好好看一下,都是中文注释,写得很详细,说几个基本的,BMKAnnotation(该类为标注点的protocol,提供了标注类的基本信息函数),BMKAnnotationView(标注view,也就是地图上要显示的那些点的大头针view)。

你说的加大头针可以这样做:

创建mapview之后,设置delegate为当前vc,然后创建BMKPointAnnotation(一个BMKPointAnnotation就是一个地图上的点,如果有多个,用for 循环创建然后每一个都[self.mapView addAnnotation:annotation]),然后在mapview的delegate方法里这样

- (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>)annotation

{

//如果annotation为用户自身位置的小蓝点 就什么都不做

if ([annotation isKindOfClass:[BMKUserLocation class]]) {

return nil

}

if ([annotation isKindOfClass:[GOEAnnotation class]]) {

//这是我自定义的,如果你不需要就用系统的

GOEAnnotationView* newAnnotationView = [[GOEAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:@"myAnnotation"]

return newAnnotationView

}

return nil

}

在Android中添加图层的方法,一般来说是定义一个overlay对象,比如说属于MyOverlay类,MyOverlay是继承于ItemizedOverlay<Item>的,然后定义一个overlayitem,继承于OverLayItem,在使用的时候就是新建一个overlayitem对象,overlayitem =new overlayitem (GeoPoint point, String directiondir, String routetag),point包含了这个点的经纬度,后面两个数据就是你在点击这个点的时候可以显示的数据,当然至于你想怎么显示就看每个人不同的想法了。overlay在定义的时候会传入一个图片参数,以便显示,然后就是把overlayitem对象加到overlay中,在点击图片的时候会调用MyOverlay中的OnTop方法。至于我们要显示的两个信息,就是overlayitem对象中的后两个参数,我们可以根据点击时得到的index来创建一个item,然后调用item的gettitle getsnippet方法来获得两个参数。

下面是添加自定义图层,不是简单的显示一个图标,但是这次这个也只是一个框架,还没完全实现

这里有这么一个关系,BusOverlay继承于BalloonItemizedOverlay<BusOverlayItem>,这个又继承于ItemizedOverlay<Item>,对于BusOverlayItem,它继承与OverlayItem,首先

BusOverlay BusOverlay = new BusOverlay(drawable, this, stoptagList,mapView,density,style)

BusOverlayItem overlayitem = new BusOverlayItem(point,"测试数据","测试数据")

BusOverlay.addOverlay(overlayitem)

简单的写下创建两个对象,然后将这个BusOverlayItem传递到BusOverlay中。刚才说到BusOverlayItem的后面两个参数是点击时显示数据的地发,这里为什么用测试数据呢,我们待会再说。然后我们进入OnTop方法,在点击图层的时候,

boolean ret=BusOverlay.super.onTap(index)

我们先返回他父类的OnTop方法,这里我们要显示的d出框用的是FrameLayout类型的对象,FrameLayout就是可以显示d出框的那种样式的嘛,我们新建一个BalloonoverLayView <Item extends OverlayItem>,继承与FrameLayout,再创建一个BusPopupView,这个类的对象就是我们要显示的框实体。

protected BalloonoverLayView<Item>balloonView//矩形提示框

在OnTop方法中,如果这个类对象是空的话,我们就去创建这样的一个实体。

if (balloonView == null)

balloonView = createBalloonOverlayView()

在creatBalloonOverlayView方法中我们新建

BusPopupView view = new BusPopupView(getMapView().getContext(),getBalloonBottomOffset(),density,sb)

参数我们先不管,这个类必然会调用BalloonoverLayView<Item>的构造函数,

在BalloonoverLayView<Item>的构造函数中,

protected LinearLayout layoutprivate TextView titleprivate TextView snippetprotected View layoutViewprotected float densityprivate StringBuffer sb

public BalloonoverLayView(Context context, int balloonBottomOffset,float density,StringBuffer sb) {

super(context)

this.density = density

this.sb=sb

setPadding(10, 0, 10, balloonBottomOffset)//设置位置

layout = new LinearLayout(context)

layout.setVisibility(VISIBLE)

LayoutInflater inflater = (LayoutInflater) context

.getSystemService(Context.LAYOUT_INFLATER_SERVICE)

//这一步先加载了d出框的布局

layoutView = inflater.inflate(R.layout.balloon_map_overlay, layout)

//d出框中的两行信息,可见R.id.balloon_item_title框图中

title = (TextView) layoutView.findViewById(R.id.balloon_item_title)

snippet = (TextView) layoutView.findViewById(R.id.balloon_item_snippet)

System.out.println("布局加载都好了")

}

有些参数不是为了框架的搭建,我们先不讲,为了从xml文件中直接引入我们的大致框架,用到layoutView = inflater.inflate(R.layout.balloon_map_overlay, layout),根据文档中创建layout。说明下,title和snippet是xml文件中的两个控件,为了显示上面文字用的。父类构造结束,我们回到BusPopupView的构造函数中,

FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(

LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)

params.gravity = Gravity.NO_GRAVITY

addView(layout, params)

在子类中把刚才处理过的layout拿过来,继承父类的数据嘛,添加到视图中,此时BusPopupView的构造函数也结束了,那就返回了一个view嘛

BusPopupView view = new BusPopupView(getMapView().getContext(),getBalloonBottomOffset(),density,sb)

if (balloonView == null)

balloonView = createBalloonOverlayView()

这个view就是由ballooView接受。

GeoPoint point = currentFocussedItem.getPoint()

MapView.LayoutParams params = new MapView.LayoutParams(

LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, point,

MapView.LayoutParams.BOTTOM_CENTER)

params.mode = MapView.LayoutParams.MODE_MAP

//使得d出框可见

balloonView.setVisibility(View.VISIBLE)

mapView.addView(balloonView, params)

我们只讲显示d出框的框架,所以上面点击以后触发的方法就不写了,至于其他方法以后再写吧。还是一嘛

把刚才的视图传进来的balloonView 设置一下参数,然后将这个视图加载mapview中。mapview是在构造函数中传进来的,就是主窗口中的mapview。

本文包括:

百度地图中

1、如何使用three的功能

2、如何获取相机

3、如何射线检测

1、百度地图中如何使用threejs

引入百度地图api与mapvgl。

创建一个view

const view = new mapvgl.View({ map })

创建three层

const threelayer = new mapvgl.ThreeLayer()

将three层挂载到view上

view.addLayer(threelayer)

完成初始化

使用three的内容时,通过mapvgl.THREE可以获取与原生THREE几乎一致的api。

渲染对象挂载到threeLayer上,便可以在场景中渲染出模型。无需手动调用renderer.render

2、百度地图中如何获取相机

threeLayer本身放置一个相机,但是此相机始终为初始状态,原因在后面放出。

在threelayer.webglLayer.viewMatrix可以获取view矩阵,

在threelayer.webglLayer.projectionMatrix可以获取投影矩阵,

以上两个矩阵能够反解出相机对象。

3、百度地图中如何射线检测

如果用2解出的这个相机,对场景做射线检测,将会始终失败,原因如下:

与原生THREE不同的地方在于,渲染对象挂载的threelayer,本质上是一个object3d对象,他的localMatrix就是上面提到的viewMatrix,也就是说,threelayer可以等同与一个相机。

每一个Object3d的worldMatrix并不是world空间,而是在view空间,这也解释了为什么threeLayer获取的相机始终为初始状态。因为world空间转view空间,并不靠相机对象而是在object3d树计算matrix时完成。

此时的射线检测策略更加简单,在view空间下做射线检测,具体为:ray的origin为(0,0,0)点,ray的dir方向为(0,0,1),apply(threelayer.webglLayer.projectionMatrix.getInverse).normlize()。

用这个射线即可正确检测出结果,但是请注意,此时结果返回的相交点依旧是view空间下,如果需要使用,需要转到world空间。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11961616.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存