第15行: | 第15行: | ||
List<OverlayOptions> overlayOptionses = new ArrayList<OverlayOptions>(); | List<OverlayOptions> overlayOptionses = new ArrayList<OverlayOptions>(); | ||
// step node | // step node | ||
− | if (mRouteLine.getAllStep() | + | if (mRouteLine.getAllStep()!= null |
&& mRouteLine.getAllStep().size() > 0) { | && mRouteLine.getAllStep().size() > 0) { | ||
− | for (TransitRouteLine.TransitStep step | + | for (TransitRouteLine.TransitStep step: mRouteLine.getAllStep()) { |
Bundle b = new Bundle(); | Bundle b = new Bundle(); | ||
b.putInt("index", mRouteLine.getAllStep().indexOf(step)); | b.putInt("index", mRouteLine.getAllStep().indexOf(step)); | ||
− | if (step.getEntrance() | + | if (step.getEntrance()!= null) { |
overlayOptionses | overlayOptionses | ||
.add((new MarkerOptions()).position(step.getEntrance().getLocation()) | .add((new MarkerOptions()).position(step.getEntrance().getLocation()) | ||
第29行: | 第29行: | ||
if (mRouteLine.getAllStep().indexOf(step) == (mRouteLine | if (mRouteLine.getAllStep().indexOf(step) == (mRouteLine | ||
.getAllStep().size() - 1) | .getAllStep().size() - 1) | ||
− | && step.getExit() | + | && step.getExit()!= null) { |
overlayOptionses | overlayOptionses | ||
.add((new MarkerOptions()).position(step.getExit().getLocation()) | .add((new MarkerOptions()).position(step.getExit().getLocation()) | ||
第36行: | 第36行: | ||
} | } | ||
} | } | ||
− | if (mRouteLine.getStarting() | + | if (mRouteLine.getStarting()!= null) { |
overlayOptionses | overlayOptionses | ||
.add((new MarkerOptions()).position(mRouteLine.getStarting().getLocation()) | .add((new MarkerOptions()).position(mRouteLine.getStarting().getLocation()) | ||
− | .icon(getStartMarker() | + | .icon(getStartMarker()!= null? getStartMarker() |
− | + | : BitmapDescriptorFactory.fromAssetWithDpi("Icon_start.png")) | |
.zIndex(10)); | .zIndex(10)); | ||
} | } | ||
− | if (mRouteLine.getTerminal() | + | if (mRouteLine.getTerminal()!= null) { |
overlayOptionses | overlayOptionses | ||
.add((new MarkerOptions()) | .add((new MarkerOptions()) | ||
.position(mRouteLine.getTerminal().getLocation()) | .position(mRouteLine.getTerminal().getLocation()) | ||
− | .icon(getTerminalMarker() | + | .icon(getTerminalMarker()!= null? getTerminalMarker(): |
BitmapDescriptorFactory | BitmapDescriptorFactory | ||
.fromAssetWithDpi("Icon_end.png")) | .fromAssetWithDpi("Icon_end.png")) | ||
第53行: | 第53行: | ||
} | } | ||
// polyline | // polyline | ||
− | if (mRouteLine.getAllStep() | + | if (mRouteLine.getAllStep()!= null |
&& mRouteLine.getAllStep().size() > 0) { | && mRouteLine.getAllStep().size() > 0) { | ||
ArrayList<Integer> textureIndexs = new ArrayList<Integer>(); | ArrayList<Integer> textureIndexs = new ArrayList<Integer>(); | ||
List<LatLng> points = new ArrayList<LatLng>(); | List<LatLng> points = new ArrayList<LatLng>(); | ||
− | for (TransitRouteLine.TransitStep step | + | for (TransitRouteLine.TransitStep step: mRouteLine.getAllStep()) { |
if (step.getWayPoints() == null) { | if (step.getWayPoints() == null) { | ||
continue; | continue; | ||
第63行: | 第63行: | ||
for (int i = 0; i < step.getWayPoints().size(); ++i) { | for (int i = 0; i < step.getWayPoints().size(); ++i) { | ||
if (step.getStepType() | if (step.getStepType() | ||
− | + | != TransitRouteLine.TransitStep.TransitRouteStepType.WAKLING) { | |
textureIndexs.add(0); | textureIndexs.add(0); | ||
} else { | } else { | ||
第92行: | 第92行: | ||
} | } | ||
List<OverlayOptions> overlayOptions = getOverlayOptions(); | List<OverlayOptions> overlayOptions = getOverlayOptions(); | ||
− | if (overlayOptions | + | if (overlayOptions!= null) { |
mOverlayOptionList.addAll(getOverlayOptions()); | mOverlayOptionList.addAll(getOverlayOptions()); | ||
} | } | ||
− | for (OverlayOptions option | + | for (OverlayOptions option: mOverlayOptionList) { |
mBaiduMap.addOverlay(option) | mBaiduMap.addOverlay(option) | ||
} | } | ||
第107行: | 第107行: | ||
if (mOverlayList.size() > 0) { | if (mOverlayList.size() > 0) { | ||
LatLngBounds.Builder builder = new LatLngBounds.Builder(); | LatLngBounds.Builder builder = new LatLngBounds.Builder(); | ||
− | for (Overlay overlay | + | for (Overlay overlay: mOverlayList) { |
// polyline 中的点可能太多,只按marker 缩放 | // polyline 中的点可能太多,只按marker 缩放 | ||
if (overlay instanceof Marker) { | if (overlay instanceof Marker) { | ||
第130行: | 第130行: | ||
model.instruction = step.instruction; | model.instruction = step.instruction; | ||
NSString *instruction = step.instruction; | NSString *instruction = step.instruction; | ||
− | NSDictionary *attrs = @{NSFontAttributeName | + | NSDictionary *attrs = @{NSFontAttributeName: [UIFont fontWithName:@"PingFangSC-Regular" size:16 * widthScale]}; |
CGSize size = CGSizeMake(KScreenWidth - 86 * widthScale, MAXFLOAT); | CGSize size = CGSizeMake(KScreenWidth - 86 * widthScale, MAXFLOAT); | ||
CGSize actualsize = [instruction boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:attrs context:nil].size; | CGSize actualsize = [instruction boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:attrs context:nil].size; |
2022年1月21日 (五) 14:43的版本
公交路线规划
功能场景
出行app中使用公交路线规划可用到此功能。
Android
iOS
//mapopen-website-wiki.bj.bcebos.com/demos/AndroidVideos/Android公交路线规划.mp4
1590746640|//mapopen-website-wiki.bj.bcebos.com/demos/newqrcodes/公交路线规划.png
扫码体验
使用产品
Android地图SDK|/index.php?title=androidsdk
>
市内公交路线规划|/index.php?title=androidsdk/guide/route/indoortransit
下载源码
//mapopen-website-wiki.bj.bcebos.com/demos/BaiduMapSDKExample.zip
核心接口
类
接口
描述
RoutePlanSearch
newInstance()
创建路线规划检索实例
RoutePlanSearch
setOnGetRoutePlanResultListener(OnGetRoutePlanResultListener listener)
设置路线规划检索监听器
RoutePlanSearch
transitSearch(TransitRoutePlanOption option)
发起公交路线规划检索请求
RoutePlanSearch
destory()
释放路线规划检索实例
OnGetRoutePlanResultListener
onGetTransitRouteResult(TransitRouteResult transitRouteResult)
公交路线规划的结果回调函数
PlanNode
withCityNameAndPlaceName(String cityName, String placeName)
路线规划起终点参数
TransitRoutePlanOption
from(PlanNode startNode)
设置路线规划起点参数
TransitRoutePlanOption
to(PlanNode endNode)
设置路线规划终点参数
TransitRoutePlanOption
city(String cityName)
设置路线规划所在的城市名称
TransitRouteOverlay
setData(TransitRouteLine routeLine)
设置公交路线规划结果数据
TransitRouteOverlay
addToMap()
添加公交路线添加到地图上
TransitRouteOverlay
zoomToSpanPaddingBounds(int paddingLeft, int paddingTop, int paddingRight, int paddingRight)
将公交路线调整到地图显示的最佳视野范围内
核心代码
1.公交路线规划结果解析
JAVA
/** * 设置路线数据。 * * @param line 路线数据 */ public void setData(TransitRouteLine line) { mRouteLine = line; } @Override public final List<OverlayOptions> getOverlayOptions() { if (mRouteLine == null) { return null; } List<OverlayOptions> overlayOptionses = new ArrayList<OverlayOptions>(); // step node if (mRouteLine.getAllStep()!= null && mRouteLine.getAllStep().size() > 0) { for (TransitRouteLine.TransitStep step: mRouteLine.getAllStep()) { Bundle b = new Bundle(); b.putInt("index", mRouteLine.getAllStep().indexOf(step)); if (step.getEntrance()!= null) { overlayOptionses .add((new MarkerOptions()).position(step.getEntrance().getLocation()) .anchor(0.5f, 0.5f).zIndex(10).extraInfo(b) .icon(getIconForStep(step))); } // 最后路段绘制出口点 if (mRouteLine.getAllStep().indexOf(step) == (mRouteLine .getAllStep().size() - 1) && step.getExit()!= null) { overlayOptionses .add((new MarkerOptions()).position(step.getExit().getLocation()) .anchor(0.5f, 0.5f).zIndex(10).icon(getIconForStep(step))); } } } if (mRouteLine.getStarting()!= null) { overlayOptionses .add((new MarkerOptions()).position(mRouteLine.getStarting().getLocation()) .icon(getStartMarker()!= null? getStartMarker() : BitmapDescriptorFactory.fromAssetWithDpi("Icon_start.png")) .zIndex(10)); } if (mRouteLine.getTerminal()!= null) { overlayOptionses .add((new MarkerOptions()) .position(mRouteLine.getTerminal().getLocation()) .icon(getTerminalMarker()!= null? getTerminalMarker(): BitmapDescriptorFactory .fromAssetWithDpi("Icon_end.png")) .zIndex(10)); } // polyline if (mRouteLine.getAllStep()!= null && mRouteLine.getAllStep().size() > 0) { ArrayList<Integer> textureIndexs = new ArrayList<Integer>(); List<LatLng> points = new ArrayList<LatLng>(); for (TransitRouteLine.TransitStep step: mRouteLine.getAllStep()) { if (step.getWayPoints() == null) { continue; } for (int i = 0; i < step.getWayPoints().size(); ++i) { if (step.getStepType() != TransitRouteLine.TransitStep.TransitRouteStepType.WAKLING) { textureIndexs.add(0); } else { textureIndexs.add(1); } } points.addAll(step.getWayPoints()); } overlayOptionses.add(new PolylineOptions().points(points).width(15).dottedLine(true) .customTextureList(getCustomTextureList()).textureIndex(textureIndexs) .zIndex(0)); } return overlayOtionses; } public List<BitmapDescriptor> getCustomTextureList() { ArrayList<BitmapDescriptor> list = new ArrayList<BitmapDescriptor>(); list.add(BitmapDescriptorFactory.fromAsset("Icon_road_blue_arrow.png")); list.add(BitmapDescriptorFactory.fromAsset("Icon_road_green_arrow.png")); return list; }
复制
深色
复制成功
2.将公交路线添加到地图上
JAVA
/** * 将公交路线添加到地图上 */ public final void addToMap() { if (mBaiduMap == null) { return; } List<OverlayOptions> overlayOptions = getOverlayOptions(); if (overlayOptions!= null) { mOverlayOptionList.addAll(getOverlayOptions()); } for (OverlayOptions option: mOverlayOptionList) { mBaiduMap.addOverlay(option) } }
复制
深色
复制成功
3.将公交路线调整到地图显示的最佳视野范围内
JAVA
public void zoomToSpanPaddingBounds(int paddingLeft, int paddingTop, int paddingRight, int paddingBottom) { if (mBaiduMap == null) { return; } if (mOverlayList.size() > 0) { LatLngBounds.Builder builder = new LatLngBounds.Builder(); for (Overlay overlay: mOverlayList) { // polyline 中的点可能太多,只按marker 缩放 if (overlay instanceof Marker) { builder.include(((Marker) overlay).getPosition()); } } mBaiduMap.setMapStatus(MapStatusUpdateFactory .newLatLngBounds(builder.build(), paddingLeft, paddingTop, paddingRight, paddingBottom)); } }
复制
深色
复制成功
更多功能
跨城公交路线规划|/index.php?title=androidsdk/guide/route/transit