一文搞定腾讯地图开发中的路线规划和小车平滑移动

前言

在网约车行业的开发者,需要用到LBS(Location Based Service),即基于位置的服务,国内提供LBS服务的有百度地图、腾讯地图、高德地图,本文选取的是腾讯地图的LBS即腾讯位置服务,这个demo可以实现路线规划、小车平滑等基础功能。

实现步骤

先看下实现效果:

新建个Android项目并新建个Activity,命名为DrivingRouteActivity,先来画一下UI布局,布局比较简单,由一个腾讯SDK包下的地图组件MapView,以及两个用于输入起始位置的输入框,两个确认路线规划的Button,一个定位当前位置的ImageView,一个用于显示行程信息的TextView组成,布局代码只是为了方便展示实现功能,所以下面直接贴出布局代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".activity.DrivingRouteActivity"><com.tencent.tencentmap.mapsdk.maps.MapViewandroid:id="@+id/mapview"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:gravity="bottom"android:paddingTop="10dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><EditTextandroid:id="@+id/from_et"android:hint="您在哪儿上车"android:layout_weight="1"android:layout_marginTop="10dp"android:layout_marginBottom="10dp"android:layout_marginLeft="10dp"android:layout_width="match_parent"android:layout_height="50dp"></EditText><ImageButtonandroid:id="@+id/location_ib"android:background="@drawable/sendtocar_balloon"android:layout_marginTop="10dp"android:layout_marginBottom="10dp"android:layout_marginRight="10dp"android:layout_width="50dp"android:layout_height="50dp"></ImageButton></LinearLayout><EditTextandroid:id="@+id/to_et"android:hint="您要去哪儿"android:layout_width="match_parent"android:layout_height="50dp"android:layout_marginBottom="5dp"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"></EditText><TextViewandroid:id="@+id/orderdesc_tv"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:textSize="20sp"></TextView><Buttonandroid:id="@+id/confirm_btn"android:text="确定"android:layout_width="match_parent"android:layout_height="50dp"android:layout_marginBottom="10dp"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"android:visibility="gone"></Button><Buttonandroid:id="@+id/order_btn"android:text="预约快车"android:layout_width="match_parent"android:layout_height="50dp"android:layout_marginBottom="10dp"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"></Button></LinearLayout></LinearLayout>

1.账号注册与配置

在开发之前,我们需要到腾讯位置服务官网注册一个账号
注册后进入控制台
选择key管理,点击创建新秘钥,按照申请信息提交申请

将上面申请的key在application标签下进行如下配置(value替换成自己的key)

<meta-dataandroid:name="TencentMapSDK"android:value="XXXXX-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX" />

2.引入腾讯Android地图SDK

进入Android地图SDK,下载3D版地图SDK压缩包
下载完成后打开压缩包,将libs文件夹下的jar包拷贝到app的libs目录下,右键该jar包选择add as library添加为依赖,并且在项目app\src\main路径下建立名为jniLibs的目录,把压缩包libs/jniLibs/strip文件夹下的所有包放到jniLibs目录下
引入后在AndroidManifest.xml文件下配置相关权限

<!-- 访问网络获取地图服务 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 检查网络可用性 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 访问WiFi状态 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 需要外部存储写权限用于保存地图缓存 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 获取 device id 辨别设备 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

3.地图初始化

配置完成,现在开始实现我们的逻辑交互,为了让实现逻辑更加清晰,我将业务逻辑代码与视图渲染代码分到了两个包中,除了activity包中的DrivingRouteActivity之外,新建了一个present包,并在包下建立一个DrivingRoutePresent类,分别由DrivingRouteActivity负责对UI组件进行视图渲染,由DrivingRoutePresent类负责业务逻辑。这里我还新建了一个contract包,并创建一个DrivingRouteContract接口,通过这个接口定义的方法,实现DrivingRoutePresent与DrivingRouteActivity之间的交互。我们在DrivingRouteContract接口中定义两个接口,一个View接口供DrivingRouteActivity实现,一个Presenter接口供DrivingRoutePresent实现,并定义一些初始化的方法

public interface DrivingRouteContract {interface View{void initView();//初始化Viewvoid initOnClick();//初始化OnClickListenervoid setOrderDescTV(String content);//渲染订单行程信息EditText getFromET();}interface Presenter{void attachView(DrivingRouteContract.View view);//绑定View}
}

接着再让DrivingRouteActivity实现DrivingRouteContract.View接口并声明UI中的组件进行初始化

public class DrivingRouteActivity extends Activity implements DrivingRouteContract.View, View.OnClickListener {private MapView mapView;private TencentMap mMap;private Button confirmBtn;private Button orderBtn;private ImageButton locationIB;private EditText fromET;private EditText toET;private TextView orderDescTV;private DrivingRoutePresent drivingRoutePresent;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_driving_route);initView();initOnClick();}@Overridepublic void onClick(View view) {switch (view.getId()){case R.id.order_btn://实现行程路线规划break;case R.id.confirm_btn://开启动画移动break;case R.id.location_ib://定位当前位置break;}}/*** mapview的生命周期管理*/@Overrideprotected void onStart() {super.onStart();mapView.onStart();}@Overrideprotected void onResume() {super.onResume();mapView.onResume();}@Overrideprotected void onPause() {super.onPause();mapView.onPause();}@Overrideprotected void onStop() {super.onStop();mapView.onStop();}@Overrideprotected void onDestroy() {super.onDestroy();mapView.onDestroy();}@Overrideprotected void onRestart() {super.onRestart();mapView.onRestart();}@Overridepublic void initView() {mapView = findViewById(R.id.mapview);confirmBtn = findViewById(R.id.confirm_btn);orderBtn = findViewById(R.id.order_btn);locationIB = findViewById(R.id.location_ib);fromET = findViewById(R.id.from_et);toET = findViewById(R.id.to_et);orderDescTV = findViewById(R.id.orderdesc_tv);mMap = mapView.getMap();drivingRoutePresent = new DrivingRoutePresent();drivingRoutePresent.attachView(this);}@Overridepublic void initOnClick() {orderBtn.setOnClickListener(this);confirmBtn.setOnClickListener(this);locationIB.setOnClickListener(this);}@Overridepublic void setOrderDescTV(String content) {orderDescTV.setText(content);}@Overridepublic EditText getFromET() {return fromET;}
}

DrivingRoutePresent实现DrivingRouteContract.Presenter接口

public class DrivingRoutePresent implements DrivingRouteContract.Presenter {private DrivingRouteContract.View drinvingRouteView;@Overridepublic void attachView(DrivingRouteContract.View view) {drinvingRouteView = view;}
}

因为我们后面在多个地方都需要用到当前应用的上下文,为了方便,需要再编写一个全局的应用上下文工具类来帮助我们获取上下文,建立一个util包并创建一个GlobalApplication类

public class GlobalApplication extends Application {private static Context context;@Overridepublic void onCreate() {super.onCreate();context = getApplicationContext();}public static Context getContext(){return context;}
}

同时,在Android类文件的application标签中加入下面属性,让应用启动时加载上面的GlobalApplication

android:name=".util.GlobalApplication"

到这里,我们就完成了界面与业务代码的基本设计,运行app,可以看到显示的基本地图信息。接下来我们来实现一下路线规划的功能。腾讯官方Android地图SDK开发文档对路线规划服务和地址解析都有较详细的说明。
另外还提供了调用示例Demo。如果不清楚如何调用的话可以参考官方Demo或参考下面代码。

4.地址解析与路线规划

首先我们在DrivingRouteContract.Presenter接口申明一个用于通过地址查找经纬度的geocoder方法和一个用于路线规划的routePlan方法

public interface DrivingRouteContract {interface View{void initView();//初始化Viewvoid initOnClick();//初始化OnClickListenervoid setOrderDescTV(String content);//渲染订单行程信息EditText getFromET();}interface Presenter{void attachView(DrivingRouteContract.View view);//绑定Viewvoid geocoder(String address, Integer type);//地址解码,转经纬度void routePlan();//实现路线规划}
}

通过腾讯Android地图SDK路线规划服务的开发文档,我们了解到要获得规划路线需要先获取起点和终点的经纬度,而在一般业务场景中,我们几乎不会让用户手动输入经纬度,所以我这里还需要用到地址解析服务,通过输入中文地址来获取经纬度,再通过经纬度规划路线(不过在实际业务中最好是加上关键词输入提示这个服务,方便用户找到输入的位置)。

在DrivingRoutePresent类中实现这两个方法

public static final Integer FROM_TYPE = 0x100; //获取起始位置坐标
public static final Integer TO_TYPE = 0x101; //获取目的位置坐标
private LatLng fromLatLng;
private LatLng toLatLng;/*** 地址解码* @param address 传入需要解码的地址* @param type 地址类型,起始位置、目的位置*/
@Override
public void geocoder(String address, final Integer type) {TencentSearch tencentSearch = new TencentSearch(GlobalApplication.getContext());Address2GeoParam address2GeoParam =new Address2GeoParam(address);tencentSearch.address2geo(address2GeoParam, new HttpResponseListener<BaseObject>() {@Overridepublic void onSuccess(int arg0, BaseObject arg1) {if (arg1 == null) {return;}Address2GeoResultObject obj = (Address2GeoResultObject)arg1;if (obj.result.latLng != null) {if (type==FROM_TYPE)fromLatLng = obj.result.latLng;else if (type==TO_TYPE)toLatLng = obj.result.latLng;routePlan();}}@Overridepublic void onFailure(int arg0, String arg1, Throwable arg2) {Log.e("test", "error code:" + arg0 + ", msg:" + arg1);}});
}private TencentSearch tencentSearch = new TencentSearch(GlobalApplication.getContext());
private StringBuffer lineStringBuilder = new StringBuffer();//路线坐标
private Double taxiFare = 0d;//预估打车费用
private Float distance = 0f;//预计全程里程/*** 路线规划*/
@Override
public void routePlan() {if (fromLatLng!=null&&toLatLng!=null){Toast.makeText(GlobalApplication.getContext(), "正在为您规划路线", Toast.LENGTH_SHORT).show();DrivingParam drivingParam = new DrivingParam(fromLatLng, toLatLng);drivingParam.policy(DrivingParam.Policy.TRIP);//驾车路线规划策略,网约车场景,送乘客drivingParam.setCarNumber("粤A00001");//填入车牌号,在路线规划时会避让车牌限行区域tencentSearch.getRoutePlan(drivingParam, new HttpResponseListener<DrivingResultObject>() {@Overridepublic void onSuccess(int i, DrivingResultObject drivingResultObject) {for (DrivingResultObject.Route route : drivingResultObject.result.routes){for (LatLng latLng : route.polyline){lineStringBuilder.append(latLng.latitude + "," + latLng.longitude);lineStringBuilder.append(",");}distance += route.distance;taxiFare += route.taxi_fare.fare;}drinvingRouteView.setOrderDescTV("行程大约" + distance + "m,预计¥" + taxiFare + "元");//清空行程路线,里程,费用信息lineStringBuilder = new StringBuffer();distance = 0f;taxiFare = 0d;}@Overridepublic void onFailure(int i, String s, Throwable throwable) {Log.d("DrivingRouteActivity", "onSuccess: " + s + i);}});fromLatLng=null;toLatLng=null;}
}

其中geocoder方法用于获得我们输入的起始位置(从哪儿上车),以及输入的目的位置(到哪儿下车)的坐标经纬度,记录位置的经纬度后调用routePlan方法请求路线规划接口,并记录下里程,费用信息,路线行驶过程中经过的点的经纬度(用于后面实现小车移动)。

路线规划接口除了上面使用的几个常用参数外,还有很多接口参数,具体可以查看官方接口文档按需要加入

参考官方接口文档:https://lbs.qq.com/AndroidDocs/doc_3d/index.html

5.车辆行驶动画

有了路线规划方法后,给"预约快车"按钮添加实现

@Override
public void onClick(View view) {switch (view.getId()){case R.id.order_btn:drivingRoutePresent.geocoder(fromET.getText().toString(), DrivingRoutePresent.FROM_TYPE);drivingRoutePresent.geocoder(toET.getText().toString(), DrivingRoutePresent.TO_TYPE);confirmBtn.setVisibility(View.VISIBLE);orderBtn.setVisibility(View.GONE);break;case R.id.confirm_btn://开启动画移动break;case R.id.location_ib://定位当前位置break;}
}

此时,运行APP,输入起点和终点就可以获得驾车的规划路线了

接下来,我们再实现一下效果图上小车根据规划路线行驶的功能

在DrivingRouteContract.View接口中加入小车动画初始化方法initAnimation

public interface DrivingRouteContract {interface Model{}interface View{void initView();//初始化Viewvoid initOnClick();//初始化OnClickListenervoid setOrderDescTV(String content);//渲染订单行程信息EditText getFromET();void initAnimation(String line);//初始化小车移动动画}interface Presenter{void attachView(DrivingRouteContract.View view);//绑定Viewvoid startLocation(boolean single);void stopLocation();void geocoder(String address, Integer type);//地址解码,转经纬度void routePlan();//实现路线规划}
}

实现initAnimation方法,关于Marker其他参数同样参考上面的接口文档

private Marker mCarMarker;
private LatLng[] mCarLatLngArray;
private MarkerTranslateAnimator mAnimator;@Override
public void initAnimation(String line) {//拆分获得经纬度数组String[] linePointsStr = line.split(",");mCarLatLngArray = new LatLng[linePointsStr.length / 2];for (int i = 0; i < mCarLatLngArray.length; i++) {double latitude = Double.parseDouble(linePointsStr[i * 2]);double longitude = Double.parseDouble(linePointsStr[i * 2 + 1]);mCarLatLngArray[i] = new LatLng(latitude, longitude);}//添加小车路线mMap.addPolyline(new PolylineOptions().add(mCarLatLngArray).color(R.color.colorLine));//这个颜色是colors.xml中自定义的颜色//添加小车LatLng carLatLng = mCarLatLngArray[0];mCarMarker = mMap.addMarker(new MarkerOptions(carLatLng).anchor(0.5f, 0.5f).icon(BitmapDescriptorFactory.fromResource(R.mipmap.taxi_t))//小车图标.flat(true).clockwise(false));//创建移动动画mAnimator = new MarkerTranslateAnimator(mCarMarker, 50 * 1000, mCarLatLngArray, true);//调整最佳视野mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(LatLngBounds.builder().include(Arrays.asList(mCarLatLngArray)).build(), 50));
}

并在routePlan方法中调用这个方法,传入行驶路线字符串

//初始化小车动画
drinvingRouteView.initAnimation(lineStringBuilder.substring(0, lineStringBuilder.length()-1));

完整代码参考

/*** 路线规划*/
@Override
public void routePlan() {if (fromLatLng!=null&&toLatLng!=null){Toast.makeText(GlobalApplication.getContext(), "正在为您规划路线", Toast.LENGTH_SHORT).show();DrivingParam drivingParam = new DrivingParam(fromLatLng, toLatLng);drivingParam.policy(DrivingParam.Policy.TRIP);//驾车路线规划策略,网约车场景,送乘客drivingParam.setCarNumber("粤A00001");//填入车牌号,在路线规划时会避让车牌限行区域tencentSearch.getRoutePlan(drivingParam, new HttpResponseListener<DrivingResultObject>() {@Overridepublic void onSuccess(int i, DrivingResultObject drivingResultObject) {for (DrivingResultObject.Route route : drivingResultObject.result.routes){for (LatLng latLng : route.polyline){lineStringBuilder.append(latLng.latitude + "," + latLng.longitude);lineStringBuilder.append(",");}distance += route.distance;taxiFare += route.taxi_fare.fare;}//初始化小车动画drinvingRouteView.initAnimation(lineStringBuilder.substring(0, lineStringBuilder.length()-1));drinvingRouteView.setOrderDescTV("行程大约" + distance + "m,预计¥" + taxiFare + "元");//清空行程路线,里程,费用信息lineStringBuilder = new StringBuffer();distance = 0f;taxiFare = 0d;}@Overridepublic void onFailure(int i, String s, Throwable throwable) {Log.d("DrivingRouteActivity", "onSuccess: " + s + i);}});fromLatLng=null;toLatLng=null;}
}

最后我们在"确定"按钮的点击事件上调用MarkerTranslateAnimator的startAnimation方法来开始动画

@Override
public void onClick(View view) {switch (view.getId()){case R.id.order_btn:drivingRoutePresent.geocoder(fromET.getText().toString(), DrivingRoutePresent.FROM_TYPE);drivingRoutePresent.geocoder(toET.getText().toString(), DrivingRoutePresent.TO_TYPE);confirmBtn.setVisibility(View.VISIBLE);orderBtn.setVisibility(View.GONE);break;case R.id.confirm_btn://开启动画移动mAnimator.startAnimation();orderBtn.setVisibility(View.VISIBLE);confirmBtn.setVisibility(View.GONE);break;case R.id.location_ib://定位当前位置break;}
}

6.引入腾讯Android定位SDK

基本效果已经完成了,现在还差最后一个定位功能,要实现定位功能需要引入另一个SDK(Android定位SDK)

我们打开Android定位SDK开发文档,下载最新的SDK
将压缩包内的jar包放入app的libs包下,并添加为依赖
再把压缩包libs文件夹下的各个so文件拷贝到项目jniLibs的对应目录中
打开AndroidManifest.xml文件,加入下面权限配置

<!-- 通过GPS得到精确位置 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 通过网络得到粗略位置 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 访问网络. 某些位置信息需要从网络服务器获取 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 访问WiFi状态. 需要WiFi信息用于网络定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 修改WiFi状态. 发起WiFi扫描, 需要WiFi信息用于网络定位 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 访问网络状态, 检测网络的可用性. 需要网络运营商相关信息用于网络定位 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 访问网络的变化, 需要某些信息用于网络定位 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<!-- 访问手机当前状态, 需要device id用于网络定位 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 支持A-GPS辅助定位 -->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<!-- 用于 log 日志 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

7.显示当前定位

配置完成后,我们在DrivingRouteContract.Presenter接口中加入一个开始定位的startLocation和一个结束定位的stopLocation方法

void startLocation(boolean single);
void stopLocation();

再实现一下DrivingRoutePresent的方法

private boolean IS_SINGLE_LOCATION_MODE = false;//是否连续定位
private TencentLocationManager mLocationManager = TencentLocationManager.getInstance(GlobalApplication.getContext());
private TencentLocationRequest locationRequest;@Override
public void startLocation(boolean single) {IS_SINGLE_LOCATION_MODE = single;//因为这里只需要定位一次,所以加了个参数locationRequest = TencentLocationRequest.create();locationRequest.setInterval(5000);//定位间隔//根据用户获取的位置信息的详细程度,REQUEST_LEVEL_ADMIN_AREA:包含经纬度,位置所处的中国大陆行政区划locationRequest.setRequestLevel(TencentLocationRequest.REQUEST_LEVEL_ADMIN_AREA);locationRequest.setAllowGPS(true);//是否允许使用GPS定位mLocationManager.requestLocationUpdates(locationRequest, this);//连续定位
}@Override
public void stopLocation() {mLocationManager.removeUpdates(this);
}

除此之外,为了获得定位的位置信息,我们还需要让DrivingRoutePresent额外实现TencentLocationListener接口,实现onLocationChanged(用于接收定位结果)和onStatusUpdate(用于接收GPS,WiFi,Cell的状态码)方法。

@Overridepublic void onLocationChanged(TencentLocation tencentLocation, int i, String s) {if (IS_SINGLE_LOCATION_MODE)stopLocation();switch (i){case TencentLocation.ERROR_OK://定位成功drinvingRouteView.setLocation(tencentLocation);//渲染定位信息if (drinvingRouteView.getFromET()!=null&&drinvingRouteView.getFromET().getText().toString().trim().equals(""))drinvingRouteView.getFromET().setText(tencentLocation.getAddress());
//                Toast.makeText(GlobalApplication.getContext(), "定位成功", Toast.LENGTH_SHORT).show();break;case TencentLocation.ERROR_NETWORK:Toast.makeText(GlobalApplication.getContext(), "网络问题引起的定位失败", Toast.LENGTH_SHORT).show();break;case TencentLocation.ERROR_BAD_JSON:Toast.makeText(GlobalApplication.getContext(), "GPS, Wi-Fi 或基站错误引起的定位失败", Toast.LENGTH_SHORT).show();break;case TencentLocation.ERROR_WGS84:Toast.makeText(GlobalApplication.getContext(), "无法将WGS84坐标转换成GCJ-02坐标时的定位失败", Toast.LENGTH_SHORT).show();break;case TencentLocation.ERROR_UNKNOWN:Toast.makeText(GlobalApplication.getContext(), "未知原因引起的定位失败", Toast.LENGTH_SHORT).show();break;}}@Overridepublic void onStatusUpdate(String s, int i, String s1) {//TencentLocationListener回调此方法传入的GPS,WiFi,Cell状态码,具体状态码查看Android定位SDK开发文档}

最后,我们再把给定位的小按钮绑定的点击事件加上实现,在onResume和onPause方法调用一下startLocation和stopLocation方法让app在开启或切换回当前Activity时自动定位

@Override
public void onClick(View view) {switch (view.getId()){case R.id.order_btn:drivingRoutePresent.geocoder(fromET.getText().toString(), DrivingRoutePresent.FROM_TYPE);drivingRoutePresent.geocoder(toET.getText().toString(), DrivingRoutePresent.TO_TYPE);confirmBtn.setVisibility(View.VISIBLE);orderBtn.setVisibility(View.GONE);break;case R.id.confirm_btn://开启动画移动mAnimator.startAnimation();orderBtn.setVisibility(View.VISIBLE);confirmBtn.setVisibility(View.GONE);break;case R.id.location_ib://定位一次drivingRoutePresent.startLocation(true);break;}
}@Override
protected void onResume() {super.onResume();mapView.onResume();drivingRoutePresent.startLocation(true);
}@Override
protected void onPause() {super.onPause();mapView.onPause();drivingRoutePresent.stopLocation();
}

结尾

写到这里,效果图上所有的功能就基本完成了,总的来说,功能还是十分强大的,对于有相关需求的企业来说开发起来非常省时省力。另外开发文档和接口文档也比较详细。由于时间有限,暂时只体验了其中的几个服务,有更多需求的同学可以自行到官网探索。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/58070.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智慧城市系列之智能交通系统(ITS)

第四章 ITS的主要内容 ITS的基本功能表现在&#xff1a;减少出行时间、保障交通安全、缓解交通拥挤、减少交通污染等四个方面&#xff0c;其最终目标是建立一个实时、准确、高效的交通运输管理系统。ITS的基本功能模块包括&#xff1a;先进的出行者信息系统&#xff08;ATIS&…

基于百度、高德路线规划的出行圈获取

想获取更准确的出行圈数据该怎么办呢?这个时候,我们就可以使用百度、高德的路线规划API去实现这一点。 百度、高德的路径规划服务以海量的交通大数据为基础,综合考虑道路拥堵、红绿灯等待等实际交通情况,是一种已经过大量实际项目检验的商业级数据服务。我们常用的地图导航…

以数字化、智能化、可视化为中心,打造智慧交通运维新标杆

交通作为国民经济和社会发展的基础性、先行性产业&#xff0c;在整个社会经济、民生发展中占有举足轻重的地位&#xff0c;随着包括5G基站建设、城际高速铁路和城市轨道交通、大数据中心、工业互联网在内的新基建按下加速键&#xff0c;轨道交通云联网加速实施。在此背景下&…

【大数据】城市公交网络分析与可视化(四):绘制城市公交(地铁)线路图

内容介绍 梗概&#xff1a;爬取公交路径坐标&#xff0c;处理成为符合高德地图Map Lab线形图的格式&#xff0c;通过该平台绘制公交&#xff08;地铁&#xff09;线路图等 一些必要的知识点可在该系列博客的其他内容中获得&#xff01; 1 采用循环法获取线路名 怎么获取一个…

自动驾驶轨迹预测/规划可视化工具

该可视化工具在ubuntu18.04下基于ros实现。该文档基于EPSILON的README操作流程完成。 参考文献&#xff1a;EPSILON: An Efficient Planning System for Automated Vehicles in Highly Interactive Environments github&#xff1a;GitHub - HKUST-Aerial-Robotics/EPSILON 目…

图扑数字孪生智慧公路,构建互联协同智能交通系统

前言 随着智能交通科技和产业的发展&#xff0c;我国正在形成一个安全可靠、便捷高效、绿色智能、开放共享的现代化综合交通运输体系。《“十四五”现代综合交通运输体系发展规划》明确提出&#xff0c;加快智能技术深度推广应用&#xff0c;坚持创新驱动发展&#xff0c;推动…

【腾讯地图API】制作多途经点的线路导航——路线坐标规划

面试&#xff1a;你懂什么是分布式系统吗&#xff1f;Redis分布式锁都不会&#xff1f;>>> 最近百度地图转腾讯地图以前用过百度地图实现路线坐标规划,不过搜索了一些没有搜索到腾讯地图的路线坐标规划,于是参数百度的思路写了个腾讯地图的路线坐标规划. 这两家地图…

GPT专业应用:自动撰写宣传稿

●图片由Lexica 生成&#xff0c;输入&#xff1a;Staff working on product promotion 宣传稿是指按照有关政策文件或相关精神&#xff0c;以宣传某种主张、某项工作、某件事情等为目的&#xff0c;为获得理解、支持而撰写的应用文。基本格式包含四个要素&#xff0c;分别是标…

百度AI 人工智能可以申请体验了,附登录方式

百度发布了一款名为“文心一言”的知识增强大语言 AI 模型&#xff0c; 它基于百度飞桨深度学习平台和文心知识增强大模型&#xff0c;旨在帮助人们从大量信息中挑选所需内容&#xff0c;获取灵感和知识&#xff0c;以使生活和工作更加便捷。该模型具有强大的中文语料库&#…

基于Python+AIML+Tornado的智能聊天机器人(NLP+深度学习)含全部工程源码+语料库 适合个人二次开发

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境Tornado 环境 模块实现1. 前端2. 后端3. 语料库4. 系统测试 其它资料下载 前言 本项目旨在利用AIML技术构建一个聊天机器人&#xff0c;实现用户通过聊天界面与机器人交互的功能。通过提供的工程源代码&#xf…

Midjourney官方中文版登陆QQ!25张免费额度,聊天框召唤机器人即可作画

丰色 发自 凹非寺量子位 | 公众号 QbitAI Breaking News&#xff01;现在上QQ就能玩Midjourney了。 Midjourney AI微信号发布最新公告称&#xff1a; Midjourney官方中文版已开启内测。 在哪里测&#xff1f;QQ频道。每周一和周五晚6点&#xff0c;大家准时扫码进入&#xff0c…

js调用gpt3.5(支持流回显、高频功能)

参考链接&#xff1a;直接在前端调用 GPT-3 API 效果图&#xff1a; 查看在线demo(要梯子) 注意&#xff1a; 1. 需要apiKey&#xff0c;自用安全&#xff0c;不要给别人 2. 需要梯子 3. 选择稳定、人少的代理ip 4. 不要频繁切换ip&#xff0c;防止封号 5. api调用上限高&…

自媒体多平台助手——融媒宝

近些年来随着自媒体风越吹越大&#xff0c;更多的博主或者自媒体发布平台&#xff0c;都在建议自由职业者去做自媒体工作&#xff0c;性价比高时间自由&#xff0c;也越来越多向往自由的年轻人去选择自媒体工作&#xff0c;在家就可以根据自己的兴趣把自己的思想转化为自己的收…

自媒体多平台分发教程

自媒体平台现在风很大&#xff0c;已经是处在风口浪尖了&#xff0c;所以想要赚钱或者是想要实现自己个人价值的朋友们都不要放过这个难得的好机会。但是现在自媒体平台多种多样&#xff0c;如果只选择一个多自媒体平台去进行发布的话无疑是浪费的。创造出一篇属于自己的原创文…

自媒体平台操作手册,自媒体平台算法操作技巧详解

自媒体平台算法&#xff1a; 定位领域&#xff1a;历史、军事&#xff08;最赚钱&#xff09;发布时间&#xff1a; 00&#xff1a;00 2日推荐昵称&#xff1a;关键词寓意简介&#xff1a;直截了当、开门见山回头率&#xff1a;多次阅读流量&#xff1a;外部流量&#xff08…

ChatGPT还是挺强大的,今天测试了一个冒泡排序 代码写的还是很规范,未来低级程序员是不是要失业了 有点焦虑了

感兴趣的小伙伴可以自己注册体验&#xff08;免费注册&#xff09;。 注册连接&#xff1a;https://chatgptmirror.com?shareK36L42

大模型入坑指南 大厂vs初创公司

大模型竞争激烈&#xff0c;创业公司随时可能倒掉&#xff0c;造成项目烂尾&#xff0c;EB3.5已经跟国内其他模型拉开了差距… 人工智能是当前时代的重要热点之一&#xff0c;它正在改变着我们的生活和工作。在人工智能领域&#xff0c;有一种技术尤其引人注目&#xff0c;那就…

UE4中背景音乐的制作

首先将音乐的MP3格式转换为WAV格式&#xff0c;在格式工厂里实现。 然后就可以了。将做好的音频导入内容浏览器中&#xff0c; 在内容浏览器里面新建Sound Cue 再在场景当中右键place actor选中我们创建的Sound Cue即可 点击音频下的文字&#xff0c;进入属性面板&…

给音频添加背景音乐 GoldWave软件运用教程分享

简略录制了一段音频&#xff0c;试听成效之后觉得有些枯燥&#xff0c;我们可以给其添加一段背景音乐&#xff0c;从而烘托氛围。今天小编就来教大家运用GoldWave来为音频添加背景音乐&#xff0c;细致方法如下&#xff0c;请参考。 如何应用goldwave添加音频背景音乐? 翻开Go…

小程序背景音乐实现

好久没有做小程序&#xff0c;今天看到一个需求&#xff0c;要做一个页面&#xff0c;需要带背景音乐。我看了官方文档&#xff0c;觉得这方面写的很好&#xff0c;但是没有示例&#xff0c;所以就想写一篇相关文章记录一下&#xff0c;也可以帮到其他人。 需求分析 实现一个…