//
|
// LocationSearchManager.swift
|
// TicketProject
|
//
|
// Created by alvin_y on 2018/9/10.
|
// Copyright © 2018年 yang-wang. All rights reserved.
|
//
|
|
import Foundation
|
import HandyJSON
|
import AMapSearchKit
|
class AddressModelInfo: NSObject, Codable{
|
|
|
var address: String = ""
|
var addressDetails: String = ""
|
var name: String = ""
|
var lon: Double = 0.0
|
var lat: Double = 0.0
|
var city: String = ""
|
var adcode: String = ""
|
var area: String = ""
|
var code: String = ""
|
|
|
}
|
|
protocol LocationSearchDelegate: class {
|
func onSearchDone(address: [AddressModelInfo])
|
}
|
|
class LocationSearchManager: NSObject {
|
|
lazy var searchApi: AMapSearchAPI = {
|
let api = AMapSearchAPI()
|
api?.delegate = self
|
return api!
|
|
}()
|
var keywordRequst: AMapPOIKeywordsSearchRequest {
|
return AMapPOIKeywordsSearchRequest()
|
}
|
var aroundRequest: AMapPOIAroundSearchRequest {
|
return AMapPOIAroundSearchRequest()
|
}
|
var geoCodeRequest: AMapGeocodeSearchRequest {
|
return AMapGeocodeSearchRequest()
|
}
|
var rGeoCodeRequest: AMapReGeocodeSearchRequest {
|
return AMapReGeocodeSearchRequest()
|
}
|
var districtSearchRequest: AMapDistrictSearchRequest {
|
return AMapDistrictSearchRequest()
|
}
|
|
weak var searchDelegate: LocationSearchDelegate?
|
|
func startPoiSearch(keyword: String, city: String) {
|
let request = keywordRequst
|
request.keywords = keyword
|
request.city = city
|
request.cityLimit = true
|
searchApi.aMapPOIKeywordsSearch(request)
|
}
|
func startPoiSearch(city: String) {
|
let request = geoCodeRequest
|
request.address = city
|
searchApi.aMapGeocodeSearch(request)
|
}
|
func startPoiSearch(lat: Double, lng: Double) {
|
let request = aroundRequest
|
request.radius = 100
|
aroundRequest.location = AMapGeoPoint.location(withLatitude: CGFloat(lat), longitude: CGFloat(lng))
|
searchApi.aMapPOIAroundSearch(request)
|
}
|
|
func startReverseSearch(lat: Double, lng: Double) {
|
let request = rGeoCodeRequest
|
request.location = AMapGeoPoint.location(withLatitude: CGFloat(lat), longitude: CGFloat(lng))
|
request.requireExtension = true
|
searchApi.aMapReGoecodeSearch(request)
|
}
|
|
|
func startSearch(city: String) {
|
let request = districtSearchRequest
|
request.keywords = city
|
searchApi.aMapDistrictSearch(request)
|
}
|
class func convertAmapPoiToAddressMode(amap: AMapPOI,mode:AddressModelInfo) -> AddressModelInfo {
|
let m = AddressModelInfo()
|
m.address = amap.name
|
m.addressDetails = "\(amap.city ?? "")\(amap.district ?? "")\(amap.address ?? "")"
|
m.name = amap.name
|
m.lon = Double(amap.location.longitude)
|
m.lat = Double(amap.location.latitude)
|
m.city = amap.city == "" ? mode.city : amap.city
|
m.code = amap.citycode == "" ? mode.code : amap.citycode
|
m.adcode = amap.adcode
|
m.area = amap.province + amap.city + amap.district
|
return m
|
}
|
class func convertAmapPoiToAddressMode(amap: AMapPOI) -> AddressModelInfo {
|
let m = AddressModelInfo()
|
m.address = amap.name
|
m.addressDetails = "\(amap.city ?? "")\(amap.district ?? "")\(amap.address ?? "")"
|
m.name = amap.name
|
m.lon = Double(amap.location.longitude)
|
m.lat = Double(amap.location.latitude)
|
m.city = amap.city
|
m.code = amap.citycode
|
m.adcode = amap.adcode
|
m.area = amap.province + amap.city + amap.district
|
return m
|
}
|
class func convertAmapPoiToAddressMode(amap: AMapAOI) -> AddressModelInfo {
|
let m = AddressModelInfo()
|
m.address = amap.name
|
m.name = amap.name
|
m.lon = Double(amap.location.longitude)
|
m.lat = Double(amap.location.latitude)
|
m.city = amap.name
|
m.code = amap.adcode
|
m.adcode = amap.adcode
|
m.area = amap.name
|
return m
|
}
|
|
class func convertAmapPoiToAddressMode(amap: AMapAOI,mode:AddressModelInfo) -> AddressModelInfo {
|
let m = AddressModelInfo()
|
m.address = amap.name
|
m.name = amap.name
|
m.lon = Double(amap.location.longitude)
|
m.lat = Double(amap.location.latitude)
|
m.city = mode.city
|
m.code = mode.code
|
m.adcode = mode.adcode
|
m.area = mode.area
|
return m
|
}
|
|
class func convertAmapRegeoCodeToAddressMode(lng: Double,lat: Double,code: AMapReGeocode) -> AddressModelInfo {
|
let m = AddressModelInfo()
|
if let streetNumber = code.addressComponent.streetNumber{
|
m.address = streetNumber.street ?? ""
|
m.addressDetails = "\(code.addressComponent.city ?? "")\(code.addressComponent.district ?? "")\(streetNumber.street ?? "")\(streetNumber.number ?? "")"
|
m.name = streetNumber.street ?? ""
|
}else{
|
m.address = code.addressComponent.country + code.addressComponent.city + code.addressComponent.township
|
m.addressDetails = code.addressComponent.country + code.addressComponent.city + code.addressComponent.township
|
m.name = code.addressComponent.country + code.addressComponent.city + code.addressComponent.township
|
}
|
m.lon = lng
|
m.lat = lat
|
m.city = code.addressComponent.city ?? ""
|
m.area = code.addressComponent.province ?? "" + code.addressComponent.city
|
return m
|
}
|
|
class func convertAmapGeoCodeToAddressMode(code: AMapGeocode) -> AddressModelInfo {
|
let m = AddressModelInfo()
|
m.address = code.township ?? "街道"
|
m.addressDetails = "\(code.city ?? "")\(code.district ?? "")\(code.formattedAddress ?? "")"
|
m.name = code.township ?? "街道"
|
m.lon = Double(code.location.longitude)
|
m.lat = Double(code.location.latitude)
|
m.city = code.city
|
m.area = code.province + code.city + code.district
|
return m
|
}
|
|
}
|
extension LocationSearchManager: AMapSearchDelegate {
|
func aMapSearchRequest(_ request: Any!, didFailWithError error: Error!) {
|
loggerswift.error(s: error.localizedDescription)
|
}
|
func onGeocodeSearchDone(_ request: AMapGeocodeSearchRequest!, response: AMapGeocodeSearchResponse!) {
|
var results: [AddressModelInfo] = []
|
if response.count > 0 {
|
for p in response.geocodes {
|
results.append(LocationSearchManager.convertAmapGeoCodeToAddressMode(code: p))
|
}
|
}
|
searchDelegate?.onSearchDone(address: results)
|
}
|
|
func onReGeocodeSearchDone(_ request: AMapReGeocodeSearchRequest!, response: AMapReGeocodeSearchResponse!) {
|
var resutls: [AddressModelInfo] = []
|
if let regeocode = response.regeocode {
|
let mode = LocationSearchManager.convertAmapRegeoCodeToAddressMode(lng: Double(request.location.longitude), lat: Double(request.location.latitude), code: regeocode)
|
mode.code = regeocode.addressComponent.adcode
|
// resutls.append(mode)
|
// if let pois = code.pois {
|
// for poi in pois {
|
// let mode = LocationSearchManager.convertAmapPoiToAddressMode(amap: poi, mode: mode)
|
// mode.code = code.addressComponent.adcode
|
// resutls.append(mode)
|
// }
|
// }
|
if regeocode.aois.count > 0{
|
for aois in regeocode.aois {
|
let mode = LocationSearchManager.convertAmapPoiToAddressMode(amap: aois,mode: mode)
|
mode.code = regeocode.addressComponent.adcode
|
resutls.append(mode)
|
}
|
}else if(regeocode.pois.count > 0){
|
for pois in regeocode.pois{
|
let mode = LocationSearchManager.convertAmapPoiToAddressMode(amap: pois, mode: mode)
|
mode.code = regeocode.addressComponent.adcode
|
resutls.append(mode)
|
}
|
}
|
}else{
|
alert(text: "获取位置信息错误请重试!")
|
}
|
// loggerswift.success(s: "搜索的\(resutls[0].addressDetails)")
|
searchDelegate?.onSearchDone(address: resutls)
|
}
|
|
func onPOISearchDone(_ request: AMapPOISearchBaseRequest!, response: AMapPOISearchResponse!) {
|
var resutls: [AddressModelInfo] = []
|
for i in 0..<response.pois.count {
|
resutls.append(LocationSearchManager.convertAmapPoiToAddressMode(amap: response.pois[i]))
|
}
|
searchDelegate?.onSearchDone(address: resutls)
|
}
|
}
|