package com.xianning.driver.base.gaode
|
|
import android.content.Context
|
import android.graphics.Color
|
import android.location.LocationManager
|
import android.os.Bundle
|
import android.text.TextUtils
|
import android.view.View
|
import androidx.core.content.ContextCompat
|
import com.baidu.location.BDAbstractLocationListener
|
import com.baidu.location.LocationClient
|
import com.baidu.location.LocationClientOption
|
import com.baidu.location.LocationClientOption.LocationMode
|
import com.baidu.mapapi.map.*
|
import com.baidu.mapapi.model.LatLng
|
import com.baidu.mapapi.model.LatLngBounds
|
import com.baidu.mapapi.search.core.SearchResult
|
import com.baidu.mapapi.search.district.DistrictSearch
|
import com.baidu.mapapi.search.district.DistrictSearchOption
|
import com.baidu.mapapi.search.district.OnGetDistricSearchResultListener
|
import com.baidu.mapapi.search.geocode.*
|
import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener
|
import com.baidu.mapapi.search.poi.PoiNearbySearchOption
|
import com.baidu.mapapi.search.poi.PoiSearch
|
import com.baidu.mapapi.search.sug.OnGetSuggestionResultListener
|
import com.baidu.mapapi.search.sug.SuggestionSearch
|
import com.baidu.mapapi.search.sug.SuggestionSearchOption
|
import com.xianning.driver.R
|
import java.util.*
|
|
|
object AMapKit {
|
|
fun initLocation(context: Context, lisener: BDAbstractLocationListener):LocationClient? { //初始化定位
|
var mLocationClient:LocationClient? = null
|
try {
|
mLocationClient = LocationClient(context)
|
} catch (e: java.lang.Exception) {
|
e.printStackTrace()
|
}
|
val option = LocationClientOption()
|
option.locationMode = LocationMode.Hight_Accuracy
|
option.setScanSpan(5000)
|
//可选,设置发起定位请求的间隔,int类型,单位ms
|
//如果设置为0,则代表单次定位,即仅定位一次,默认为0
|
//如果设置非0,需设置1000ms以上才有效
|
option.setOpenGnss(true)
|
//可选,设置是否使用卫星定位,默认false
|
//使用高精度和仅用设备两种定位模式的,参数必须设置为true
|
option.setIgnoreKillProcess(true);
|
//可选,定位SDK内部是一个service,并放到了独立进程。
|
//设置是否在stop的时候杀死这个进程,默认(建议)不杀死,即setIgnoreKillProcess(true)
|
option.SetIgnoreCacheException(false);
|
option.setIsNeedAddress(true)
|
//可选,默认gcj02,设置返回的定位结果坐标系,如果配合百度地图使用,建议设置为bd09ll;
|
option.setCoorType("bd09ll")
|
//可选,设置是否收集Crash信息,默认收集,即参数为false
|
mLocationClient?.setLocOption(option)
|
mLocationClient?.registerLocationListener(lisener)
|
mLocationClient?.start()
|
return mLocationClient
|
}
|
|
fun initMap(savedInstanceState: Bundle?, mapView: MapView): BaiduMap {
|
val aMap = mapView.map
|
val uiSettings = aMap.uiSettings
|
uiSettings.isCompassEnabled = false
|
mapView.showScaleControl(false)
|
mapView.showZoomControls(false)
|
return aMap
|
}
|
|
fun drawLine(context: Context, aMap: BaiduMap, start: LatLng, end: LatLng): Overlay? {
|
val latLngs: MutableList<LatLng> = ArrayList()
|
latLngs.add(start)
|
latLngs.add(end)
|
//设置折线的属性
|
val mOverlayOptions: OverlayOptions = PolylineOptions()
|
.width(10)
|
.color(ContextCompat.getColor(context, R.color.main_yellow_qia))
|
.points(latLngs)
|
//在地图上绘制折线
|
//mPloyline 折线对象
|
return aMap.addOverlay(mOverlayOptions)
|
}
|
|
|
fun drawLineAndMove(context: Context, aMap: BaiduMap, start: LatLng, end: LatLng, padd: Int) {
|
drawLine(context, aMap, start, end)
|
moveCamera(aMap, start, end, padd)
|
}
|
|
|
fun drawLine(context: Context, aMap: BaiduMap, points: List<LatLng>?): Overlay? {
|
val latLngs: MutableList<LatLng> = ArrayList()
|
latLngs.addAll(points ?: arrayListOf())
|
//设置折线的属性
|
val mOverlayOptions: OverlayOptions = PolylineOptions()
|
.width(10)
|
.color(ContextCompat.getColor(context, R.color.qing))
|
.points(latLngs)
|
//在地图上绘制折线
|
//mPloyline 折线对象
|
if (aMap!=null)
|
return aMap.addOverlay(mOverlayOptions)
|
return null
|
}
|
|
fun moveCamera(aMap: BaiduMap, latlng: LatLng) {
|
val mapStatusUpdate = MapStatusUpdateFactory.newLatLng(latlng)
|
aMap.animateMapStatus(mapStatusUpdate, 8)
|
}
|
|
fun moveCamera(aMap: BaiduMap, start: LatLng?, end: LatLng?) {
|
val bounds = LatLngBounds.Builder().include(start).include(end).build()
|
val mapStatusUpdate = MapStatusUpdateFactory.newLatLngBounds(bounds, 100, 100, 100, 100)
|
aMap.animateMapStatus(mapStatusUpdate)
|
}
|
|
fun moveCamera3(aMap: BaiduMap, start: LatLng?, end: LatLng?, car: LatLng?) {
|
val bounds = LatLngBounds.Builder().include(start).include(end).include(car).build()
|
val mapStatusUpdate = MapStatusUpdateFactory.newLatLngBounds(bounds, 150, 150, 150, 150)
|
aMap.animateMapStatus(mapStatusUpdate)
|
|
}
|
|
fun moveCamera(aMap: BaiduMap, start: LatLng, end: LatLng, padd: Int) {
|
val bounds = LatLngBounds.Builder().include(start).include(end).build()
|
val mapStatusUpdate = MapStatusUpdateFactory.newLatLngBounds(bounds, padd, padd, padd, padd)
|
aMap.animateMapStatus(mapStatusUpdate)
|
}
|
|
fun getOption(
|
latLng: LatLng,
|
view: View
|
): MarkerOptions {
|
return MarkerOptions().anchor(0.5f, 1f)
|
.position(latLng)
|
.icon(BitmapDescriptorFactory.fromBitmap(BaseMapActivity.convertViewToBitmap(view)))
|
.draggable(true).flat(true)
|
}
|
|
/***
|
* 修改marker的view
|
*/
|
fun getIcon(view: View): BitmapDescriptor {
|
return BitmapDescriptorFactory.fromBitmap(BaseMapActivity.convertViewToBitmap(view))
|
}
|
|
/**
|
* 添加marker点
|
*/
|
fun addMarker(
|
aMap: BaiduMap,
|
mLat: Double?,
|
mLng: Double?,
|
view: View,
|
peopleId: String
|
): Overlay? {
|
if (mLat == null || mLng == null){
|
return null
|
}
|
val options: MarkerOptions = getOption(LatLng(mLat, mLng), view)
|
val marker: Marker = aMap.addOverlay(options) as Marker
|
if (!TextUtils.isEmpty(peopleId)) {
|
marker.title = peopleId
|
}
|
return marker
|
}
|
|
fun getTance(tance: Float): String {
|
if (tance == 0f) {
|
return "0米"
|
}
|
return if (tance > 1000) {
|
String.format("%.1f公里", (tance / 1000f))
|
} else {
|
String.format("%.1f米", tance)
|
}
|
}
|
|
|
|
fun getTimeType(num: Int): String {
|
if (num in 0..60) {
|
return num.toString() + "s"
|
}
|
if (num in 60..60 * 60) {
|
return (num / 60).toString() + ":" + (num % 60).toString() + "s"
|
}
|
if (num in 60..60 * 60 * 24) {
|
return (num / 3600).toString() + ":" + ((num % 3600) / 60).toString() + ":" + (((num % 3600) % 60) % 60).toString() + "s"
|
}
|
return ""
|
}
|
|
/***
|
* 是否开启gps
|
*/
|
fun isLocServiceEnable(context: Context): Boolean {
|
val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
|
var gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)
|
var network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
|
if (gps || network) {
|
return true
|
}
|
return false
|
}
|
|
/***
|
* 监听地图的移动
|
*/
|
fun addMapMoveListener(aMap: BaiduMap, marker: Marker, finishPosition: (LatLng) -> Unit) {
|
aMap.setOnMapStatusChangeListener(object : BaiduMap.OnMapStatusChangeListener {
|
override fun onMapStatusChangeStart(p0: MapStatus?) {
|
}
|
|
override fun onMapStatusChangeStart(p0: MapStatus?, p1: Int) {
|
}
|
|
override fun onMapStatusChange(p0: MapStatus) {
|
marker.position = p0.target
|
}
|
|
override fun onMapStatusChangeFinish(p0: MapStatus) {
|
finishPosition(p0.target)
|
}
|
})
|
}
|
|
/***
|
* 逆地址编码
|
*/
|
fun getAddress(context: Context, lat: Double, lon: Double, function: (String) -> Unit) {
|
val mCoder = GeoCoder.newInstance()
|
val listener = object: OnGetGeoCoderResultListener {
|
override fun onGetGeoCodeResult(p0: GeoCodeResult?) {
|
|
}
|
|
override fun onGetReverseGeoCodeResult(reverseGeoCodeResult: ReverseGeoCodeResult?) {
|
if (reverseGeoCodeResult == null || reverseGeoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
|
//没有找到检索结果
|
function("")
|
} else {
|
//行政区号
|
function(reverseGeoCodeResult.adcode.toString())
|
}
|
}
|
|
}
|
mCoder.setOnGetGeoCodeResultListener(listener)
|
mCoder.reverseGeoCode(
|
ReverseGeoCodeOption()
|
.location(LatLng(lat, lon)) // 设置是否返回新数据 默认值0不返回,1返回
|
.newVersion(1) // POI召回半径,允许设置区间为0-1000米,超过1000米按1000米召回。默认值为1000
|
.radius(500)
|
)
|
}
|
|
/***
|
* 周边检索
|
* @param lat
|
* @param lng
|
*/
|
fun searchPoint(
|
context: Context,
|
lat: Double,
|
lng: Double,
|
var1: OnGetPoiSearchResultListener
|
) {
|
// val query = PoiSearch.Query("", "190000", "")
|
val poiNearbySearchOption = PoiNearbySearchOption()
|
poiNearbySearchOption.location(LatLng(lat, lng)).radius(2000).keyword("住宅\$交通\$娱乐场所\$景区\$商场\$银行\$酒店\$学校\$饭店").pageNum(0)
|
val query = PoiSearch.newInstance()
|
query.setOnGetPoiSearchResultListener(var1)
|
query.searchNearby(poiNearbySearchOption)
|
}
|
|
fun drawFace(context: Context, aMap: BaiduMap, latLngs: List<LatLng>): Overlay? {
|
var po = PolygonOptions().points(latLngs)
|
.fillColor(0x1A000000).stroke(Stroke(1, Color.RED))
|
return aMap.addOverlay(po)
|
}
|
|
fun drawCricle(context: Context, aMap: BaiduMap, latLng: LatLng, bg: Double): Overlay? {
|
val mCircleOptions = CircleOptions().center(latLng)
|
.radius(bg.toInt())
|
.fillColor(0x1A000000) //填充颜色
|
.stroke(Stroke(1, Color.RED)) //边框宽和边框颜色
|
return aMap.addOverlay(mCircleOptions)
|
}
|
|
fun drawFenceByCity(
|
context: Context,
|
city: String?,
|
district: String?,
|
va1: OnGetDistricSearchResultListener
|
) {
|
val mDistrictSearch = DistrictSearch.newInstance()
|
|
mDistrictSearch.setOnDistrictSearchListener(va1)
|
mDistrictSearch.searchDistrict(
|
DistrictSearchOption()
|
.cityName(city)
|
.districtName(district)
|
)
|
}
|
|
/***
|
* 输入内容自动提示
|
* @param str
|
* @param var1
|
*/
|
fun searchSite(
|
context: Context,
|
content: String?,
|
cityName: String,
|
var1: OnGetSuggestionResultListener?
|
) {
|
val mSuggestionSearch = SuggestionSearch.newInstance()
|
mSuggestionSearch.setOnGetSuggestionResultListener(var1)
|
mSuggestionSearch.requestSuggestion(
|
SuggestionSearchOption()
|
.city(cityName)
|
.keyword(content)
|
)
|
mSuggestionSearch.destroy()
|
}
|
}
|