package com.fuban.user.ui.crosscity
|
|
import android.animation.ObjectAnimator
|
import android.app.Activity
|
import android.content.Intent
|
import android.graphics.Color
|
import android.os.Bundle
|
import android.os.Looper
|
import androidx.recyclerview.widget.LinearLayoutManager
|
import cn.sinata.xldutils.utils.myToast
|
import com.amap.api.maps.AMap
|
import com.amap.api.maps.CameraUpdateFactory
|
import com.amap.api.maps.model.*
|
import com.amap.api.services.core.LatLonPoint
|
import com.amap.api.services.geocoder.*
|
import com.amap.api.services.help.Tip
|
import com.amap.api.services.poisearch.PoiResult
|
import com.fuban.user.FBApplication
|
import com.fuban.user.R
|
import com.fuban.user.network.entity.Anchor
|
import com.fuban.user.ui.TransparentStatusBarActivity
|
import com.fuban.user.ui.trip.ChoosePositionActivity
|
import com.fuban.user.ui.trip.adapter.PositionAdapter
|
import io.reactivex.subscribers.DisposableSubscriber
|
import kotlinx.android.synthetic.main.activity_choose_map_position.*
|
import kotlinx.android.synthetic.main.activity_choose_map_position.iv_center
|
import kotlinx.android.synthetic.main.activity_choose_map_position.mMapView
|
import org.jetbrains.anko.sdk27.coroutines.onClick
|
import org.jetbrains.anko.startActivityForResult
|
|
class ChooseMapPositionActivity:TransparentStatusBarActivity(), AMap.OnCameraChangeListener,GeocodeSearch.OnGeocodeSearchListener {
|
override fun setContentView() = R.layout.activity_choose_map_position
|
|
private val isStart by lazy {
|
intent.getBooleanExtra("isStart",true)
|
}
|
private val siteId by lazy {
|
intent.getIntExtra("siteId",0)
|
}
|
|
private val city by lazy {
|
intent.getStringExtra("city")
|
}
|
private val data by lazy {
|
intent.getParcelableArrayListExtra<Anchor>("data")
|
}
|
|
private var poiSearchDisposable: DisposableSubscriber<PoiResult>? = null
|
|
private val geocodeSearch by lazy {
|
GeocodeSearch(this)
|
}
|
|
|
private val mTips = ArrayList<Tip>() //搜索结果
|
private val adapter by lazy {
|
PositionAdapter(mTips,true)
|
}
|
private val aMap by lazy {
|
mMapView.map
|
}
|
|
override fun initClick() {
|
tv_back.onClick {
|
finish()
|
}
|
et_search.onClick {
|
startActivityForResult<ChoosePositionActivity>(1,"isStart" to isStart,"cityName" to city,
|
"siteId" to siteId,"data" to data)
|
}
|
adapter.setOnItemClickListener { _, position ->
|
startActivityForResult<ConfirmPositionActivity>(1,"name" to mTips[position].name,
|
"address" to if (mTips[position].address.isEmpty()) mTips[position].district else mTips[position].address,
|
"lat" to mTips[position].point.latitude,"lon" to mTips[position].point.longitude,
|
"siteId" to siteId,"code" to mTips[position].adcode,"data" to data,"isStart" to isStart)
|
}
|
}
|
|
override fun initView() {
|
title = if (isStart) "设置上车点" else "设置下车点"
|
if (isStart) et_search.hint = "您从哪里上车"
|
tv_city.text = city
|
lv_position.layoutManager = LinearLayoutManager(this)
|
lv_position.adapter = adapter
|
initMap()
|
}
|
|
private fun initMap() {
|
val myLocationStyle = MyLocationStyle()
|
myLocationStyle.strokeColor(resources.getColor(R.color.colorBrown))
|
myLocationStyle.radiusFillColor(resources.getColor(R.color.colorTransBrown))
|
myLocationStyle.interval(5000)
|
myLocationStyle.anchor(0.5f, 0.5f)
|
myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER)//
|
myLocationStyle.myLocationIcon(BitmapDescriptorFactory.fromResource(R.mipmap.icon_coordinate))
|
aMap.myLocationStyle = myLocationStyle//设置定位蓝点的Style
|
aMap.uiSettings.isMyLocationButtonEnabled = false//设置默认定位按钮是否显示,非必需设置。
|
aMap.uiSettings.setZoomInByScreenCenter(true)
|
aMap.uiSettings.isZoomControlsEnabled = false
|
aMap.uiSettings.isRotateGesturesEnabled = false
|
aMap.uiSettings.isTiltGesturesEnabled = false
|
aMap.isMyLocationEnabled = true
|
aMap.setOnCameraChangeListener(this)
|
geocodeSearch.setOnGeocodeSearchListener(this)
|
if (data.isNotEmpty())
|
data[0].apply {
|
if (type == 1){ //行政区域
|
if (districtCode == FBApplication.cityCode)
|
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(FBApplication.lat, FBApplication.lon),15f))
|
else
|
getCityLatlng(province+city+district,cityCode)
|
}else{ //电子围栏,移动到第一个坐标
|
val split = coordinate.substring(0, coordinate.indexOf(";")).split(",")
|
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(split[1].toDouble(), split[0].toDouble()),15f))
|
}
|
}
|
//遍历添加电子围栏
|
data.forEach {
|
if (it.type == 2){
|
val split = it.coordinate.split(";")
|
if (split.size == 2){ //坐标;半径,添加圆形围栏
|
val latLon = split[0].split(",")
|
val opts =
|
CircleOptions().center(LatLng(latLon[1].toDouble(), latLon[0].toDouble()))
|
.radius(split[1].toDouble())
|
.fillColor(Color.parseColor("#33FD943A"))
|
.strokeColor(Color.parseColor("#FD943A"))
|
.strokeWidth(2f)
|
aMap.addCircle(opts)
|
}else{ //点集合,添加多边形
|
val polygonOptions = PolygonOptions()
|
polygonOptions.addAll(split.map {
|
val latLon = it.split(",")
|
LatLng(latLon[1].toDouble(), latLon[0].toDouble())
|
})
|
polygonOptions.fillColor(Color.parseColor("#33FD943A"))
|
.strokeColor(Color.parseColor("#FD943A"))
|
.strokeWidth(2f)
|
aMap.addPolygon(polygonOptions)
|
}
|
}
|
}
|
}
|
|
/**
|
* 获取poi信息
|
*/
|
fun getPoi(lat: Double?, lng: Double?) {
|
if (lat == null || lng == null) {
|
return
|
}
|
val geocodeQuery = RegeocodeQuery(LatLonPoint(lat,lng),1000f,GeocodeSearch.AMAP)
|
geocodeSearch.getFromLocationAsyn(geocodeQuery)
|
|
// 改用逆地理编码实现
|
// //如果上一次还没处理完,取消订阅
|
// if (poiSearchDisposable != null && !poiSearchDisposable!!.isDisposed) {
|
// poiSearchDisposable?.dispose()
|
// }
|
// poiSearchDisposable = object : DisposableSubscriber<PoiResult>() {
|
// override fun onComplete() {
|
//
|
// }
|
//
|
// override fun onNext(t: PoiResult?) {
|
// mTips.clear()
|
// if (t != null) {
|
// t.pois.sortBy { it.distance }
|
// if (t.pois.isNotEmpty()) {
|
// t.pois.map {
|
// val tip = Tip()
|
// tip.setPostion(it.latLonPoint)
|
// tip.name = it.title
|
// tip.adcode = it.adCode
|
// tip.address = it.snippet
|
// tip.typeCode = it.provinceName + it.cityName + it.adName
|
// mTips.add(tip)
|
// }
|
// } else {
|
// Looper.prepare()
|
// myToast("附近无可用地点")
|
// Looper.loop()
|
// }
|
// } else {
|
// myToast("附近无可用地点")
|
// }
|
// runOnUiThread {
|
// val objectAnimator =
|
// ObjectAnimator.ofFloat(iv_center, "translationY", 0f, -30f, 0f).setDuration(600)
|
// objectAnimator.start()
|
// adapter.notifyDataSetChanged()
|
// }
|
// }
|
//
|
// override fun onError(t: Throwable?) {
|
// Looper.prepare()
|
// myToast("地址搜索失败")
|
// }
|
// }
|
// val query = PoiSearch.Query("", "190000", "")
|
// val poiSearch = PoiSearch(this, query)
|
//// poiSearch.bound = PoiSearch.SearchBound(LatLonPoint(lat, lng), 1000)
|
// Flowable.just(poiSearch).ioScheduler().flatMap {
|
// try {
|
// val result = poiSearch.searchPOI()
|
// if (result == null) {
|
// Flowable.error(ResultException(""))
|
// } else
|
// Flowable.just(result)
|
// } catch (e: Exception) {
|
// e.printStackTrace()
|
// Flowable.error<PoiResult>(e)
|
// }
|
// }.subscribe(poiSearchDisposable)
|
}
|
|
/**
|
* 地址编码
|
* @param name 查询地址,省市区
|
* @param code 地区编码
|
*/
|
private fun getCityLatlng(name: String,code:String) {
|
val geocodeQuery = GeocodeQuery(name, code)
|
geocodeSearch.getFromLocationNameAsyn(geocodeQuery)
|
}
|
|
|
|
override fun onCameraChangeFinish(cameraPosition: CameraPosition) {
|
getPoi(cameraPosition.target.latitude, cameraPosition.target.longitude)
|
}
|
|
override fun onCameraChange(p0: CameraPosition?) {
|
}
|
|
override fun onRegeocodeSearched(p0: RegeocodeResult?, p1: Int) {
|
if (p1 != 1000||p0 == null){
|
myToast("地址搜索失败")
|
}else{
|
p0.regeocodeAddress.let {t->
|
mTips.clear()
|
if (t != null) {
|
t.pois.sortBy { it.distance }
|
if (t.pois.isNotEmpty()) {
|
t.pois.filter { it.snippet.isNotEmpty() }.map {
|
val tip = Tip()
|
tip.setPostion(it.latLonPoint)
|
tip.name = it.title
|
tip.adcode = t.adCode
|
tip.address = it.snippet
|
tip.typeCode = it.provinceName + it.cityName + it.adName
|
mTips.add(tip)
|
}
|
} else {
|
Looper.prepare()
|
myToast("附近无可用地点")
|
Looper.loop()
|
}
|
} else {
|
myToast("附近无可用地点")
|
}
|
runOnUiThread {
|
val objectAnimator =
|
ObjectAnimator.ofFloat(iv_center, "translationY", 0f, -30f, 0f).setDuration(600)
|
objectAnimator.start()
|
adapter.notifyDataSetChanged()
|
}
|
}
|
}
|
}
|
|
override fun onGeocodeSearched(p0: GeocodeResult?, p1: Int) {
|
if (p1 == 1000) {
|
p0?.let {
|
if (it.geocodeAddressList != null && it.geocodeAddressList.isNotEmpty()) {
|
val geocodeAddress = it.geocodeAddressList[0]
|
aMap.moveCamera(
|
CameraUpdateFactory.newLatLngZoom(
|
LatLng(
|
geocodeAddress.latLonPoint.latitude,
|
geocodeAddress.latLonPoint.longitude
|
),15f
|
)
|
)
|
}
|
}
|
}
|
}
|
|
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
super.onActivityResult(requestCode, resultCode, data)
|
if (resultCode == Activity.RESULT_OK&&data!=null){
|
setResult(Activity.RESULT_OK,data)
|
finish()
|
}
|
}
|
|
override fun onResume() {
|
super.onResume()
|
mMapView.onResume()
|
}
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
super.onCreate(savedInstanceState)
|
mMapView.onCreate(savedInstanceState)
|
}
|
|
override fun onSaveInstanceState(outState: Bundle) {
|
super.onSaveInstanceState(outState)
|
mMapView.onSaveInstanceState(outState)
|
}
|
|
override fun onLowMemory() {
|
super.onLowMemory()
|
mMapView.onLowMemory()
|
}
|
|
override fun onPause() {
|
super.onPause()
|
mMapView.onPause()
|
}
|
|
override fun onDestroy() {
|
mMapView.onDestroy()
|
super.onDestroy()
|
}
|
}
|