• 引入头文件:import MapKitimport CoreLocation添加代理CLLocationManagerDelegate===========定位(一次定位、持续定位、使用期间定位、后台定位)======= func mapLocation(){ locationManager=...

    引入头文件:

    import MapKit

    import CoreLocation

    添加代理CLLocationManagerDelegate


    ===========定位(一次定位、持续定位、使用期间定位、后台定位)=======

        func mapLocation(){

           locationManager=CLLocationManager.init()

            //在使用期间发定位请求

            if (locationManager?.responds(to: #selector(CLLocationManager.requestWhenInUseAuthorization)))!{

            locationManager?.requestWhenInUseAuthorization()

    //            locationManager?.requestAlwaysAuthorization()//永久定位

            }

           

            /*     iOS9新特性: 临时获取后台定位

                当使用了使用期间授权时,可以在需要后台定位的地方,添加allowsBackgroundLocationUpdates属性,并设置为true.同时还需要打开后台定位模式 -->点击项目-->Capabilitys-->Background Modes-->勾选Location update

            不用设置永久定位,此时就可以进行临时获取后台定位信息,但是屏幕上会有蓝条信息显示

               */

            locationManager?.allowsBackgroundLocationUpdates=true//允许后台定位

            

            locationManager?.delegate=self

            //距离筛选器

            locationManager?.distanceFilter=10//位置移动10米以上才待用位置更新的代理方法

            locationManager?.desiredAccuracy=kCLLocationAccuracyKilometer//金准度

            // 比较2个位置之间的距离比较的是直线距离

            let l1:CLLocation=CLLocation.init(latitude: 40.06, longitude: 116.39)

             let l2:CLLocation=CLLocation.init(latitude: 30.06, longitude: 116.39)

            let distance:CLLocationDistance=l1.distance(from: l2);//l1距离l2的距离

            locationManager?.startUpdatingLocation()//开始定位

        }

        //完成定位---// 当完成位置更新的时候调用

        func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

    //        locations: 位置信息数据

            print("\(locations)")

    //        停止定位( 如果不 停止定为就是持续定位)

          locationManager?.stopUpdatingHeading()

            

        }


    ==============地理编码和反地理编码===========

    引入import CoreLocation

     *****

    //地理编码:把地名转换成经纬度,可能会出现一对多的情况;

     

        func geocoderClick(){

           //创建地理编码对象

            let geo:CLGeocoder=CLGeocoder.init()

            //placemarks: 地标对象

            //    //CLPlacemark中有CLLocation(可以获得经纬度),region,街道名称,城市,州很多信息。

            geo.geocodeAddressString("这里写入地址") { (placemarks, error) in

                for placemark:CLPlacemark in placemarks!{

                    if (placemarks?.count==0)||(error != nil){

                        print("解析出错")

                    }

                    //获取经纬度等信息

                    print(placemark.location?.coordinate.latitude as Any)

                    //详细地址

                    print(placemark.name as Any)

                    //城市

                    print(placemark.locality as Any)

                    //行政区域

                    print(placemark.administrativeArea as Any)

                }

            }

        }

        

        //反地理编码---经纬度变成地址

        func reverceGeocoderClick(){

            //创建地理编码对象

            let geo:CLGeocoder=CLGeocoder.init()

            //创建位置

            let l1:CLLocation=CLLocation.init(latitude: 40.06, longitude: 116.39)

            geo.reverseGeocodeLocation(l1) { (placemarks, error) in

    //            解析数据反地理编码,只会对应一个唯一的地址,所以不需要for循环

                    if (placemarks?.count==0)||(error != nil){

                        print("解析出错")

                    }

                let placemark:CLPlacemark=(placemarks?.last)!

               

                //详细地址

                print(placemark.name as Any)

                //城市

                print(placemark.locality as Any)

                //行政区域

                print(placemark.administrativeArea as Any)

                }

            }


    =============地图的基本使用===========

    引入

    MKMapViewDelegate


     /**

         // 需求:

         // 1. 显示用户位置

         // 2. 点击大头针,显示详情信息 -->反地理编码

         // 3. 切换地图类型

         // 4. 返回用户当前位置

         // 5. 放大和缩小(了解)

         // */

        let mapview:MKMapView=MKMapView.init(frame:CGRect.init(x: 0, y: 0, width: 300, height: 300))

        

        var locationManager:CLLocationManager?//位置管理器

        func anotate(){

            self.view.addSubview(mapview)

            if (locationManager?.responds(to: #selector(CLLocationManager.requestWhenInUseAuthorization)))!{

                locationManager?.requestWhenInUseAuthorization()

                //            locationManager?.requestAlwaysAuthorization()//永久定位

            }

            mapview.userTrackingMode=MKUserTrackingMode.follow//追踪模式

            mapview.delegate=self

            mapview.showsTraffic=true//显示交通状况

            mapview.showsScale=true//显示比例尺

            mapview.showsCompass=true//显示罗盘

            mapview.showsBuildings=true//显示建筑物

            mapview.mapType=MKMapType.standard//地图的显示模式,有号几个选项

            mapview.delegate=self

        }

        // 获取用户的位置

        func getUserLocation(){

            //设置地图的中心经纬度---无动画

        mapview.centerCoordinate=(mapview.userLocation.location?.coordinate)!

           //设置地图的中心点经纬度 ---有动画

             mapview.setCenter((mapview.userLocation.location?.coordinate)!, animated: true)

            

            //获取地图的中心点坐标

            let center:CLLocationCoordinate2D=(mapview.userLocation.location?.coordinate)!

            //显示跨度,1°约等于111KM

            let span:MKCoordinateSpan=MKCoordinateSpan.init(latitudeDelta: 0.01, longitudeDelta: 0.01)

            //设置region---就是设置地图缩放

            mapview.setRegion(MKCoordinateRegion.init(center: center, span: span), animated: true)

    //         将当前的显示跨度缩小一倍(*0.5)放大一倍(*2)

            let la=mapview.region.span.latitudeDelta*0.5

            let lo=mapview.region.span.longitudeDelta*0.5

            mapview.setRegion(MKCoordinateRegion.init(center: mapview.region.center, span: MKCoordinateSpan.init(latitudeDelta: la, longitudeDelta: lo)), animated: true)

        }

        

        //完成用户位置更新时调用的代理方法

        func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {

    //        userLocation是系统的大头针

            // 获取经纬度度

            print(userLocation.location?.coordinate.latitude)

            //设置标题和子标题

            userLocation.title="合肥"

            userLocation.subtitle="高新"

            

            

        }

        

        //地图显示区域发生改变的时候调用

        func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {

            //获取当前显示的跨度(缩放比例)

            print(mapview.region.span.latitudeDelta)

           

        }


    ============添加大头针=========


    import UIKit

    import MapKit

    import CoreLocation

    class RecordManager : LYBBaseVC,MKMapViewDelegate{

        var mapview:MKMapView?

        override func viewDidLoad() {

            super.viewDidLoad()

           mapview=MKMapView.init(frame: CGRect.init(x: 0, y: 0, width: WIDTH, height: HEIGHT))

            mapview?.delegate=self

           view.addSubview(mapview)

        }

        

        func adAnotation()  {

            //添加自定义的大头针模型,系统的大头针是MKPointAnnotation

            

            let annotation:MyAnnotation=MyAnnotation.init()

            annotation.coordinate=coordinate

            annotation.title="合肥1"

            annotation.subtitle="高新1"

            mapview?.addAnnotation(annotation)

        }

        override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

            //1. 获取点击的点

            let point:CGPoint=touches.first?.location(in:mapview)

              //2. 将点转换成经纬度

            let coordinate:CLLocationCoordinate2D=mapview?.convert(point, toCoordinateFrom: mapview)

            //添加大头针模型

            let annotation:MyAnnotation=MyAnnotation.init()

            annotation.coordinate=coordinate

            annotation.title="合肥"

            annotation.subtitle="高新"

            mapview?.addAnnotation(annotation)

        }

       

    }

    extension RecordManager:MKMapViewDelegate{

        func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {

            // 如果返回nil,代表着用户没有自定义大头针的需求.所有的大头针显示由系统控制

            //    //MKUserLocation --> 系统显示用户位置的大头针类

            //    // 如果不是自己的大头针模型类,返回nil

           

            if !(annotation is MyAnnotation){

                return nil

            }

           

        

            var IDS:String="anoview"//重用标识

            //    //MKAnnotationView: 里面有一个image属性,默认没有值,需要设置一张图

            //    //MKPinAnnotationView: 默认有图像

            //    //如果要更改颜色,设置掉落效果只能找子类 MKPinAnnotationView

        

            let anoview:MKPinAnnotationView=mapview?.dequeueReusableAnnotationView(withIdentifier: IDS)

          

          

            if anoview==nil{

           

           anoview=MKPinAnnotationView.init(annotation: annotation, reuseIdentifier: IDS)

            //        //如果大头针自定义了,标题和子标题默认不会实现;

            //        //设置大头针可以点击,显示标题和子标题

            

                anoview.canShowCallout=true

            //        //设置大头针左右附属视图

           

            anoview.leftCalloutAccessoryView=UISwitch.init()

                anoview.rightCalloutAccessoryView=UISwitch.init()

            //        //设置大头针头像

           anoview.image=UIImage.init(named: "")

            //        //1. 更改颜色

                anoview.pinTintColor=UIColor.red

                anoview.backgroundColor=UIColor.red

                anoview.tintColor=UIColor.yellow

            //        //2. 动画掉落

               anoview.animatesDrop=true

         }

          

                return annoView;

        }

    }

    //自定义大头针

    class MyAnnotation:MKAnnotation{

        var  coordinate:CLLocationCoordinate2D?

        var title:String?

        var subtitle:String?

        

        

    }

    =====================导航============

    import UIKit

    import MapKit

    import CoreLocation

    class RecordManager : LYBBaseVC,MKMapViewDelegate{

        var mapview:MKMapView?

        override func viewDidLoad() {

            super.viewDidLoad()

           mapview=MKMapView.init(frame: CGRect.init(x: 0, y: 0, width: WIDTH, height: HEIGHT))

            mapview?.delegate=self

           view.addSubview(mapview)

        }

        func guide(){

            //    //1. 创建CLGeocoder对象

           

            let geocoder:CLGeocoder=CLGeocoder.init()

            //    //2. 调用地理编码方法

            geocoder.geocodeAddressString("地址名") { (placemarks, error) in

                 //3.1 防错处理

                if placemarks?.count==0||error==nil{

                    return

                }

                //3.2 获取CLPlacemar对象 -->地理编码

                //        // 正向会有多个结果,咱们暂时取出一个

                let pm:CLPlacemark=placemarks?.last

                 //3.3 创建一个MKPlacemark对象

                let   mkpm:MKPlacemark=MKPlacemark.init(placemark: pm)

                //3.4 终点位置

                

                let destinationItem:MKMapItem=MKMapItem.init(placemark: mkpm)

                //        //3.5 当前位置

               

                let sourceItem:MKMapItem=MKMapItem.forCurrentLocation()

                //实现导航关键点:在于一个MKMapItem的open方法

                //        //MKMapItem: 地图上的点

                //        //需要起点和终点

                //        //3.6 调用系统地图进行导航

                let maptems=[sourceItem,destinationItem]

                //        // 导航模式. 地图类型.交通状态

                let options=[MKLaunchOptionsDirectionsModeKey :MKLaunchOptionsDirectionsModeTransit,MKLaunchOptionsMapTypeKey :MKMapTypeHybrid]

               

                MKMapItem.openMaps(with: maptems, launchOptions: options)

            }

           

            

        }

       

    }

    ================导航划线==============


    import UIKit

    import MapKit

    import CoreLocation

    class RecordManager : LYBBaseVC,MKMapViewDelegate{

        var mapview:MKMapView?

        override func viewDidLoad() {

            super.viewDidLoad()

           mapview=MKMapView.init(frame: CGRect.init(x: 0, y: 0, width: WIDTH, height: HEIGHT))

            mapview?.delegate=self

           view.addSubview(mapview)

        }

        func guide(){

            //    //1. 创建CLGeocoder对象

           

            let geocoder:CLGeocoder=CLGeocoder.init()

            //    //2. 调用地理编码方法

            geocoder.geocodeAddressString("地址名") { (placemarks, error) in

                 //3.1 防错处理

                if placemarks?.count==0||error==nil{

                    return

                }

                //3.2 获取CLPlacemar对象 -->地理编码

                //        // 正向会有多个结果,咱们暂时取出一个

                let pm:CLPlacemark=placemarks?.last

                 //3.3 创建一个MKPlacemark对象

                let   mkpm:MKPlacemark=MKPlacemark.init(placemark: pm)

                //3.4 终点位置

                

                let destinationItem:MKMapItem=MKMapItem.init(placemark: mkpm)

                //        //3.5 当前位置

               

                let sourceItem:MKMapItem=MKMapItem.forCurrentLocation()

                //实现导航关键点:在于一个MKMapItem的open方法

                //        //MKMapItem: 地图上的点

                //        //需要起点和终点

                //        //3.6 调用系统地图进行导航

                let maptems=[sourceItem,destinationItem]

                //        // 导航模式. 地图类型.交通状态

                        //3.6 计算路线

                        //1. 创建一个方向请求对象 --> 拼接URL地址的参数

                let request:MKDirectionsRequest=MKDirectionsRequest.init()

                        request.source = sourceItem;

                        request.destination = destinationItem;

                //2. 创建方向对象

                let directions:MKDirections=MKDirections.init(request: request)

                        //3. 调用方法计算路线

                directions.calculate(completionHandler: { (reponse, error) in

                    if placemarks?.count==0||error==nil{

                        return

                    }

                    //3.2 获取路线信息polyline

                    for route:MKRoute in reponse?.routes{

                        // 获取折线 多段线 polyline

                        let polyline:MKPolyline=route.polyline

                        //3.3 添加地图遮盖物

                        //Overlay: 遮盖物

                        mapview?.addOverlays(polyline)

                    }

                    

                })

                

            }

           

            

        }

       

    }

    extension RecordManager:MKMapViewDelegate{

        func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {

            //1. 创建一个渲染物对象 MKPolylineRenderer-->MKOverlayRenderer子类

            let polyline:MKPolylineRenderer=MKPolylineRenderer.init(overlay: overlay)

           

            //    //2. 设置线条颜色 --> 默认无色

           polyline.fillColor=UIColor.red

                return polyline;

        }

    }


    展开全文
  • 最近刚学Swift,总想着搞个大事件,可是实力不行,大事件还是不要搞了。利用百度地图简单写个小Demo吧。这样还能巩固Swift语法上的一些概念。百度SDK的下载,注册这里就不做介绍了。这里只写出自己如何思考以及如何...

    最近刚学Swift,总想着搞个大事件,可是实力不行,大事件还是不要搞了。利用百度地图简单写个小Demo吧。这样还能巩固Swift语法上的一些概念。百度SDK的下载,注册这里就不做介绍了。这里只写出自己如何思考以及如何利用百度地图SDK提供的API来实现自己的功能。

    • 概述
    • 利用地图SDK提供的定位服务,实现自己的功能。
    • 总结

    概述

    其实,市场上有几款很成熟的地图SDK供我们选择,对于大部分人来说,这些成熟的地图SDK提供的功能,都能满足我们的需求,问题在于,有时候很纠结啊!到底选择那个地图好呢?与其纠结那个地图好,倒不如想想,自己的APP需求是什么。这样自己封装出一些类供APP调用,而支撑这些类的功能代码,可以随意选择一个SDK。这样后期如果想更换SDK,其实很简单的事情,只需要在自己封装的类里改动就行了。调用封装类的代码无须改动。

    利用地图SDK提供的定位服务,实现自己的功能

    第一个类,获取坐标地址。需实现两个类,功能类和模型类。

    1. 功能类,提供坐标。
    2. 模型类,封装坐标信息、以及坐标所在的地址。之所以不用第三方提供的类型,是因为第三方不可能遵循一个标准。自己封装一个数据模型类。
    //这里采用Objective-C实现功能类。
    #import <Foundation/Foundation.h>
    #import <BaiduMapAPI_Location/BMKLocationComponent.h>
    
    /**
     * 设置locationAttributes属性,具体含义可参考CLLocationManager相关属性的注释。
     */
    typedef NSString* AGLocationAttributedStringKey;
    UIKIT_EXTERN AGLocationAttributedStringKey const AGDistanceFilterAttributeName;                         //CLLocationDistance
    UIKIT_EXTERN AGLocationAttributedStringKey const AGDesiredAccuracyAttributeName;                        //CLLocationAccuracy
    UIKIT_EXTERN AGLocationAttributedStringKey const AGHeadingFilterAttributeName;                          //CLLocationDegrees
    UIKIT_EXTERN AGLocationAttributedStringKey const AGPausesLocationUpdatesAutomaticallyAttributeName;     //BOOL
    UIKIT_EXTERN AGLocationAttributedStringKey const AGAllowsBackgroundLocationUpdatesAttributeName;        //BOOL
    
    
    @class AGUserLocation;
    
    typedef void(^UserLocation)(AGUserLocation *userLocation);
    
    @interface AGLocation : NSObject
    
    @property (nonatomic, strong) NSDictionary<AGLocationAttributedStringKey, id> *locationAttributes; //定位参数,定位根据参数,进行何时更新
    
    @property (nonatomic, copy) UserLocation userlocation; //回调方法
    
    - (void)startLocation; //开始定位
    - (void)stopLocation; //停止定位
    
    @end
    
    // 数据模型类
    
    #import <Foundation/Foundation.h>
    
    @class CLLocation;
    @interface AGUserLocation : NSObject
    
    // 位置信息,尚未定位成功,则该值为nil
    @property (nonatomic, strong) CLLocation *location;
    // 定位标注点要显示的标题信息
    @property (nonatomic, strong) NSString *title;
    /// 其它信息
    @property (nonatomic, strong) NSString *other;
    
    @end
    

    这里简单的给出了AGLocation、AGUserLocation的头文件,如果想看实现文件查看https://gitee.com/ag_explore/MapForSwift

    简单的给出了AGLocation,项目中如果需要坐标的话,只需要创建AGLocation对象即可。AGLocation的功能可以是第三方SDK提供。也可以是iOS API提供。总之,上层调用者不关心AGLocation的实现。这应该是开发AGLocation的猿应该关心的事情。

    下面给出调用方法

    //这里使用的是Swift
            _location = AGLocation()
            _location?.locationAttributes = [AGDistanceFilterAttributeName:kCLLocationAccuracyBest]
            _location?.userlocation = { (userLocation:AGUserLocation?) -> Void in
    
                if let userLocation = userLocation {
    
                    print("定位成功")
                    print(userLocation.location)
    
                } else {
    
                    print("定位失败")
                }
    
            }
    
            _location?.start() //开启定位

    总结

    使用AGLocation不关心AGLocation是这么实现的,它只需要关心AGLocation提供的功能是否满足。而AGLocation的实现,则需要实现AGLocation的程序员关心。这样做的好处是,我后期可以替换任何SDK。

    这篇只是定位服务,下篇封装地图。

    展开全文
  • 系统地图替换百度地图framework

    之前用的是百度地图,最后上架打包时提示百度的类库在swift中未完全编译,上架时必须取消自动bitcode功能。

    于是打算用系统自带的地图取代原来的百度地图,其实也不需要该多少代码,百度地图的类名往往也有对应的系统地图类名,只是加了个“B”,例如:

    多边形类:MKPolygon,在百度地图改成了:BMKPolygon。

    首先去掉百度类库framework,加上系统地图类库MapKit.framework:


    去掉:baidumap开头的这几个, 以及百度要用,但是我需要的QuartzCore.framework、OpenGLES.framework、SystemConfiguration.framework、CoreGraphics.framework、Security.framework等,


    然后把项目目录下的百度文件删了。。。还有桥接文件里的几个头文件

    然后定位跟踪和绘制矩形代码:

    import UIKit
    import MapKit
    import CoreLocation
    class BaiduMapViewController: UIViewController,MKMapViewDelegate {
        
        @IBOutlet weak var iosmap: MKMapView!
        var locationManager:CLLocationManager!
        var centerx:Double?
        var centery:Double?
        override func viewDidLoad() {
            super.viewDidLoad()
            iosmap.mapType = .Standard
            iosmap.delegate = self
            iosmap.showsBuildings = true
            if CLLocationManager.locationServicesEnabled(){
                iosmap.setUserTrackingMode(MKUserTrackingMode.Follow, animated: true)
                self.locationManager=CLLocationManager()
                locationManager.requestWhenInUseAuthorization()
                locationManager.requestAlwaysAuthorization()
            }
            //上班地点区域
            addPloygon()
        }
        //跟踪用户位置 并调整地图范围
        func mapView(mapView: MKMapView, didUpdateUserLocation userLocation: MKUserLocation) {
            if  let loc=userLocation.location {
                self.iosmap.centerCoordinate = loc.coordinate
                let viewregion=MKCoordinateRegionMakeWithDistance(loc.coordinate, 10000, 10000)
                self.iosmap.setRegion(viewregion, animated: true)
            }
        }
        //添加矩形区域
        func addPloygon (){
            //左下
            let x1 = 116.320313
            let y1 = 39.906578 
            //右上
            let x2 = 116.340723
            let y2 = 39.91869  
            // 添加多边形覆盖物
            var coords = [CLLocationCoordinate2D]()
            coords.append(CLLocationCoordinate2DMake(y1, x1))
            coords.append(CLLocationCoordinate2DMake(y!, x2))
            coords.append(CLLocationCoordinate2DMake(y2, x2))
            coords.append(CLLocationCoordinate2DMake(y2, x1))
            
            let  polygon = MKPolygon(coordinates: &coords, count:  Int(coords.count)) 
            self.iosmap.addOverlay(polygon) 
     
        }
    //矩形的样式
    func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer {
        if overlay is MKPolygon {
            let polygonView = MKPolygonRenderer(overlay: overlay)
            polygonView.strokeColor = UIColor.redColor()
            
            return polygonView
        }
        return MKOverlayRenderer()
    }
    
    }
    


    展开全文
  • 运用swift开发已有半年之久,最近闲来没事。学习了一点地图的知识,现在来与大家分享。直接上代码吧!  《一》高德地图搜索功能 控制器 // // ViewController.swift // AmapSeach // // ...

    运用swift开发已有半年之久,最近闲来没事。学习了一点地图的知识,现在来与大家分享。直接上代码吧!

     《一》高德地图搜索功能

    控制器

    //

    //  ViewController.swift

    //  AmapSeach

    //

    //  Created by yanfa-fengchuang on 16/8/15.

    //  Copyright © 2016 yanfa-fengchuang. All rights reserved.

    //


    import UIKit


    class ViewController: UIViewController,AMapSearchDelegate,AMapLocationManagerDelegate,UITableViewDelegate,UITableViewDataSource{

        

        var search:AMapSearchAPI!

        let locationManager = AMapLocationManager()

        var currentCity:String!

        var currentCityBtn:UIButton!

        var searchTF:UITextField!

        var location:CLLocation!

        var cancleBtn:UIButton!

        var CirtyArray:NSArray!

        var addressTableview:UITableView!

        var number:String!

        var poi :AMapPOI?

        var dataArray:NSMutableArray!

        var keyWord:String!

        var citiTableview:UITableView!

        

        override func viewDidLoad() {

            super.viewDidLoad()

            self.view.backgroundColor = UIColor.colorWithHex("#F6F6F6")!

            

            self.dataArray = NSMutableArray()

            //MARK:单次定位获取当前城市

            setHeardview()

            setOnceLocation()

            CirtyArray = ["江阴市","新沂市","邳州市","溧阳市","金坛市","常熟市","张家港市","昆山市","吴江市","太仓市","启东市","如皋市","通州市","海门市","东台市","大丰市","仪征市","高邮市","江都市","丹阳市","扬中市","句容市","兴化市","靖江市","泰兴市","姜堰市"]

            self.number = "0"

            setTableview()

            setCityTableview()

            

            search = AMapSearchAPI()

            search.delegate = self

            

        }

        

        //MARK:自定义一个假的导航条

        func setHeardview(){

            //MARK:最底下的view

            let heardview = UIView()

            heardview.frame = CGRectMake(0, 0, self.view.frame.size.width, 64)

            heardview.layer.borderWidth = 1

            heardview.layer.borderColor = UIColor.colorWithHex("#E0E0E0")!.CGColor

            self.view.addSubview(heardview)

            

            //MARK:选择城市的按钮

            self.currentCityBtn = UIButton()

            self.currentCityBtn.setTitle("北京市", forState: .Normal)

            self.currentCityBtn.setTitleColor(UIColor.blackColor(), forState: .Normal)

            self.currentCityBtn.titleLabel?.font = UIFont.systemFontOfSize(15)

            self.currentCityBtn.frame = CGRectMake(5, 25, 60, 30)

            self.currentCityBtn.addTarget(self, action: #selector(ViewController.currentCityBtnAction), forControlEvents: .TouchUpInside)

            heardview.addSubview(currentCityBtn)

            

            //MARK:竖线

            let label = UILabel()

            label.frame = CGRectMake(75, 25, 1, 30)

            label.backgroundColor = UIColor.colorWithHex("#E0E0E0")!

            heardview.addSubview(label)

            

            //MARK: 搜索框

            self.searchTF = UITextField()

            self.searchTF.frame = CGRectMake(85, 25, 180, 30)

            self.searchTF.placeholder = "您要去哪"

            self.searchTF.font = UIFont.systemFontOfSize(15)

            heardview.addSubview(self.searchTF)

            NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.beginSearch), name: UITextFieldTextDidChangeNotification, object: nil)

            //MARK:取消按钮

            self.cancleBtn = UIButton()

            self.cancleBtn.setTitle("取消", forState: .Normal)

            self.cancleBtn.setTitleColor(UIColor.blackColor(), forState: .Normal)

            self.cancleBtn.titleLabel?.font = UIFont.systemFontOfSize(15)

            self.cancleBtn.frame = CGRectMake(270, 25, 40, 30)

            heardview.addSubview(cancleBtn)

        }

        

        //MARK:城市的tableview

        func setCityTableview(){

            self.citiTableview = UITableView()

            self.citiTableview.frame = CGRectMake(0, 64, self.view.bounds.size.width, self.view.frame.size.height-64)

            self.citiTableview.delegate = self

            self.citiTableview.dataSource = self

            self.citiTableview.tableFooterView = UIView(frame:CGRectZero)

            self.view.addSubview(self.citiTableview)

            self.citiTableview.hidden = true

            //        self.citiTableview.registerClass(UITableViewCell.self, forCellReuseIdentifier: "CELLID")

        }

        

        //MARK:地点的tableview

        func setTableview(){

            self.addressTableview = UITableView()

            self.addressTableview.frame = CGRectMake(0, 64, self.view.bounds.size.width, self.view.frame.size.height-64)

            self.addressTableview.delegate = self

            self.addressTableview.dataSource = self

            self.addressTableview.tableFooterView = UIView(frame:CGRectZero)

            self.view.addSubview(self.addressTableview)

            self.addressTableview.hidden = true

        }

        

        

        //MARK:当前城市按钮的点击事件

        func currentCityBtnAction(){

            self.number = "1"

            self.addressTableview.hidden = true

            self.citiTableview.hidden = false

            self.citiTableview.reloadData()


        }

        

        

        //*****************************************************   获取当前城市    ***********************************************

        //MARK:单次定位获取当前城市

        func setOnceLocation(){

            //精度

            self.locationManager.desiredAccuracy = 100

            //   定位超时时间,最低2s,此处设置为11s

            self.locationManager.locationTimeout = 11

            //   逆地理请求超时时间,最低2s,此处设置为12s

            self.locationManager.reGeocodeTimeout = 12

            self.locationManager.delegate = self

            self.locationManager.requestLocationWithReGeocode(true) { (location, regeocode, error) in

                if (error == nil){

                    self.currentCityBtn.setTitle(regeocode.city, forState: .Normal)

                    self.location = location

                    self.keyWord = regeocode.city

                    print(location.coordinate.longitude ?? 0.00)

                    print(location.coordinate.latitude ?? 0.00)

                    //MARK:根据关键词搜索周边地理位置信息

                    self.setSearch()

                }

            }

        }

        

        //MARK:根据关键词搜索周边地理位置信息

        func setSearch(){

            

            let request = AMapPOIAroundSearchRequest()

            request.location = AMapGeoPoint.locationWithLatitude(CGFloat(self.location.coordinate.latitude), longitude: CGFloat(self.location.coordinate.longitude))

            request.keywords = self.keyWord

            request.sortrule = 0

            request.requireExtension = true

            search.AMapPOIAroundSearch(request)

        }

        

        //MARK: 返回周边位置信息(地点 ,经度,维度,附近一些商家的名字)

        func onPOISearchDone(request: AMapPOISearchBaseRequest!, response: AMapPOISearchResponse!) {

            if response.pois.count == 0 {

                return

            }

            

            for p:AMapPOI in response.pois {

                self.dataArray.addObject(p)

            }

            self.addressTableview.hidden = false

            self.addressTableview.reloadData()

            self.addressTableview.registerClass(PointCell.self, forCellReuseIdentifier: "CELL")

        }

        

        //************************************   tableview   的代理方法   ************************************

        

        //MARK:tableview 的代理方法

        func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

            if self.number != "0" {

                return self.CirtyArray.count

            }else{

                return self.dataArray.count

            }

        }

        

        //MARK:tableview所显示的内容

        func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

            if self.number != "0" {

                let identifier="identtifier";

                var cell=tableView.dequeueReusableCellWithIdentifier(identifier);

                if(cell == nil){

                    cell=UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: identifier);

                }

                cell?.textLabel?.text = self.CirtyArray[indexPath.row] as? String

                self.dataArray = NSMutableArray()

                return cell!

                

            }else{

                

                let cell:PointCell = (tableView.dequeueReusableCellWithIdentifier("CELL") as? PointCell)!

                cell.poi = self.dataArray[indexPath.row] as? AMapPOI

                return cell

            }

        }

        

        

        //MARK:CELL的点击事件

        func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

            if self.number != "0" {

                self.number = "0"

                self.currentCityBtn.setTitle(self.CirtyArray[indexPath.row] as? String, forState: .Normal)

                self.citiTableview.hidden = true

                self.searchTF.text = currentCityBtn.titleLabel?.text

               beginSearch()

    //            self.addressTableview.reloadData()

                

            }else{

                self.searchTF.text = ((self.dataArray[indexPath.row] as? AMapPOI)!).name

                print(((self.dataArray[indexPath.row] as? AMapPOI)!).location)

            }

        }

        

        //MARK: Cell 返回的高度

        func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {

            if self.number != "0" {

                return 44

            }else{

                return 55

            }

        }

        

        //****************************************************   根据输入的关键字搜索   *****************************

        

        //MARK: 开始搜索

        func beginSearch() {

            self.dataArray.removeAllObjects()

            let keywordsRequest = AMapPOIKeywordsSearchRequest()

            keywordsRequest.keywords = searchTF.text!

            keywordsRequest.city = currentCityBtn.titleLabel?.text

            keywordsRequest.requireExtension = true

            print(searchTF.text!)

            search.AMapPOIKeywordsSearch(keywordsRequest)

        }

        

        

    }

    自定义cell

    //

    //  PointCell.swift

    //  AmapSeach

    //

    //  Created by yanfa-fengchuang on 16/8/16.

    //  Copyright © 2016 yanfa-fengchuang. All rights reserved.

    //


    import UIKit


    class PointCell: UITableViewCell {


        

       var pointLabel: UILabel!

       var addressLabel: UILabel!

       var poi :AMapPOI?{

            didSet{

                pointLabel.text = poi?.name

                addressLabel.text = poi?.address

            }

        }

        override init(style: UITableViewCellStyle, reuseIdentifier: String?) {

            super.init(style: style, reuseIdentifier: reuseIdentifier)

            install()

        }

        

        func  install(){

            self.pointLabel = UILabel()

            self.pointLabel.frame = CGRectMake(10, 2.5, screenWidth, 25)

            self.pointLabel.font = UIFont.systemFontOfSize(16)

            self.pointLabel.textColor = UIColor.blackColor()

            self.addSubview(self.pointLabel)

            

            

            

            self.addressLabel = UILabel()

            self.addressLabel.frame = CGRectMake(10, 25, screenWidth, 25)

            self.addressLabel.font = UIFont.systemFontOfSize(14)

            self.addressLabel.textColor = UIColor.orangeColor()

            self.addSubview(self.addressLabel)

        }

        

        required init?(coder aDecoder: NSCoder) {

            fatalError("init(coder:) has not been implemented")

        }


    }

    《二》高德地图地图几个简单的功能

    //

    //  ViewController.swift

    //  CustomPin

    //

    //  Created by yanfa-fengchuang on 16/8/15.

    //  Copyright © 2016 yanfa-fengchuang. All rights reserved.

    //

     /// 注意  再使用地图的时候一定要开启定位服务   不然  你根本就不能显示你当前的位置所以一定要在plist文件里面添加  NSLocationAlwaysUsageDescription    请允许获取位置信息)允许定位的功能


    import UIKit


    let screenHight = UIScreen.mainScreen().bounds.size.height

    let screenWidth = UIScreen.mainScreen().bounds.size.width


    class ViewController: UIViewController,MAMapViewDelegate {


        var mapView: MAMapView!

        

        var location: CLLocationCoordinate2D!

        

        override func viewDidLoad() {

            super.viewDidLoad()

            

    //*****************************************************

        

            //地图简单的一些属性

            initMapView()

            

    //*****************************************************

            //进入地图显示给定的位置

            //showCustomPoint()

            

        }

        

        

    //**************************************************************************

      

        //MARK: 设置地图

        func initMapView() {

            mapView = MAMapView(frame: self.view.bounds)

            mapView.delegate = self

            

            //MARK:是否显示罗盘

            mapView.showsCompass = false

            

            //MARK:是否显示比例尺

            mapView.showsScale = false

            

            //MARK:是否显示用户位置(小圆点)

            mapView.showsUserLocation = true

            

            //MARK:是否显示用户位置(小圆点跟随用户的位置而移动)

            mapView.userTrackingMode = MAUserTrackingMode.Follow

            

            //MARK:地图精度(就是地图的放大级别)

            mapView.setZoomLevel(15, animated: true)

            view.insertSubview(mapView, atIndex: 0)

            

            let backlocationBtn = UIButton()

            backlocationBtn.frame = CGRectMake(20, screenHight-60, 40, 30)

            backlocationBtn.backgroundColor = UIColor.orangeColor()

            mapView.addSubview(backlocationBtn)

            backlocationBtn.addTarget(self, action: #selector(ViewController.backBtnaction), forControlEvents: .TouchUpInside)

            

            

        }

        

        //MARK: 一键返回用户当前位置按钮的点击事件

        func backBtnaction(){

            //MARK:是否显示用户位置(小圆点跟随用户的位置而移动)

            UIView.animateWithDuration(0.5, animations: { () -> Void in

                self.mapView.userTrackingMode = MAUserTrackingMode.Follow

            }) { (finished) -> Void in

            }


        }

        

     //************************* 给定一个坐标使进入地图的时候就显示这个点****************************

        

        //MARK: 进入地图显示给定的地点的位置 利用系统自带的大头针给添加进去并且显示标注

        func showCustomPoint(){

            mapView = MAMapView(frame: self.view.bounds)

            mapView.delegate = self


            //MARK:地图精度(就是地图的放大级别)

            mapView.setZoomLevel(15, animated: true)

            view.insertSubview(mapView, atIndex: 0)

            

             location = CLLocationCoordinate2D.init(latitude: 31.329674, longitude: 120.610733)

            

            self.mapView.centerCoordinate = location

            let pointAnnotation = MAPointAnnotation()//这个是标注不是大头针

            pointAnnotation.coordinate = location

            pointAnnotation.title = "苏州站"

            pointAnnotation.subtitle = "苏州火车站1号出口"

            mapView.addAnnotation(pointAnnotation)

            mapView.selectAnnotation(pointAnnotation, animated: true)

        }

        

    //    //如果没有这一句的话就不会显示标注

    //    func mapView(mapView: MAMapView!, viewForAnnotation annotation: MAAnnotation!) -> MAAnnotationView! {

    //            let pointReuseIndetifier = "pointReuseIndetifier"

    //            var  annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier(pointReuseIndetifier)

    //            if annotationView == nil {

    //                annotationView = MAPinAnnotationView.init(annotation: annotation, reuseIdentifier: pointReuseIndetifier)

    //            }

    //            annotationView.canShowCallout = true       //设置气泡可以弹出,默认为NO

    //            annotationView.draggable = true      //设置标注可以拖动,默认为NO

    //            return annotationView;

    //    }

        

        

        

    }






    展开全文
  • 先看实现后的效果,会自动检测手机安装的第三方地图。 step 1 在info.plist 里添加 URL Scheme 百度地图:baidumap:// 高德地图:iosamap:// google地图:comgooglemaps:// 腾讯地图:qqmap:/...

    先看实现后的效果,会自动检测手机安装的第三方地图。




    step 1 在info.plist 里添加 URL Scheme


    百度地图:baidumap://

    高德地图:iosamap://

    google地图:comgooglemaps://

    腾讯地图:qqmap://


    step 2 代码部分

    func creatOptionMenu(){
            optionMenu = UIAlertController(title: nil, message: nil, preferredStyle: .ActionSheet)
            
            if(SHARE_APPLICATION.canOpenURL(NSURL(string:"qqmap://")!) == true){
                let qqAction = UIAlertAction(title: "腾讯地图", style: .Default, handler: {
                    (alert: UIAlertAction!) -> Void in
                    let urlString = "qqmap://map/routeplan?from=我的位置&type=drive&tocoord=\(self.centerLat),\(self.centerLng)&to=\(self.siteTitle)&coord_type=1&policy=0"
                    let url = NSURL(string:urlString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!)
                    SHARE_APPLICATION.openURL(url!)
                    
                })
                optionMenu.addAction(qqAction)
            }
            
            if(SHARE_APPLICATION.canOpenURL(NSURL(string:"iosamap://")!) == true){
                let gaodeAction = UIAlertAction(title: "高德地图", style: .Default, handler: {
                    (alert: UIAlertAction!) -> Void in
                    let urlString = "iosamap://navi?sourceApplication=app名&backScheme=iosamap://&lat=\(self.centerLat)&lon=\(self.centerLng)&dev=0&style=2"
                    let url = NSURL(string:urlString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!)
                    SHARE_APPLICATION.openURL(url!)
                })
                optionMenu.addAction(gaodeAction)
            }
            
            if(SHARE_APPLICATION.canOpenURL(NSURL(string:"comgooglemaps://")!) == true){
                let googleAction = UIAlertAction(title: "Google地图", style: .Default, handler: {
                    (alert: UIAlertAction!) -> Void in
                    let urlString = "comgooglemaps://?x-source=app名&x-success=comgooglemaps://&saddr=&daddr=\(self.centerLat),\(self.centerLng)&directionsmode=driving"
                    let url = NSURL(string:urlString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!)
                    SHARE_APPLICATION.openURL(url!)
                    
                })
                optionMenu.addAction(googleAction)
            }
            
            let appleAction = UIAlertAction(title: "苹果地图", style: .Default, handler: {
                (alert: UIAlertAction!) -> Void in
                let loc = CLLocationCoordinate2DMake(self.centerLat, self.centerLng)
                let currentLocation = MKMapItem.mapItemForCurrentLocation()
                let toLocation = MKMapItem(placemark:MKPlacemark(coordinate:loc,addressDictionary:nil))
                toLocation.name = self.siteTitle
                MKMapItem.openMapsWithItems([currentLocation,toLocation], launchOptions: [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving,MKLaunchOptionsShowsTrafficKey: NSNumber(bool: true)])
                
            })
            optionMenu.addAction(appleAction)
            
            if(SHARE_APPLICATION.canOpenURL(NSURL(string:"baidumap://")!) == true){
                let baiduAction = UIAlertAction(title: "百度地图", style: .Default, handler: {
                    (alert: UIAlertAction!) -> Void in
                    let urlString = "baidumap://map/direction?origin={{我的位置}}&destination=latlng:\(self.centerLat),\(self.centerLng)|name=\(self.siteTitle)&mode=driving&coord_type=gcj02"
                    let url = NSURL(string:urlString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!)
                    SHARE_APPLICATION.openURL(url!)
                    
                })
                optionMenu.addAction(baiduAction)
            }
            
            let cancelAction = UIAlertAction(title: "取消", style: .Cancel, handler: {
                (alert: UIAlertAction!) -> Void in
            })
            optionMenu.addAction(cancelAction)
        }

    点击方法里,实现弹出

    self.presentViewController(optionMenu, animated: true, completion: nil)



    展开全文
  • 第一步:导入地图文件 #import  第二步:获取当前位置和目的地的经纬度,然后打开地图即可    //获取当前位置  MKMapItem *mylocation = [MKMapItem mapItemForCurrentLocation];    //当前...
  • 首先申明,此文章是转载我是闰土你是猹博主的文章,觉得有用,就拿过来,确实不好找相关案例,特此记录一下!... 重点: 这里使用的朋友直接拷贝下面代码到项目中即可...//地图类型 enum MapForm { enum MapURI:Strin...
  • 用更简单的方式去使用地图(支持 MapKit、高德地图、百度地图
  • 1、建立新项目 2 、在项目属性TARGETS->Bulid Phases的Link Binary With Libraries中添加MapKit.framework 3、在info.plist添加LSApplicationQueriesSchemes,类型为Array,然后添加四个item,分别是:baidumap,...
  • import UIKit //1.导入框架 import MapKit class ViewController: UIViewController { lazy var geoCoder : CLGeocoder = { return CLGeocoder() }() ... override func touchesBe...
  • 高德地图开发需要自己到官网http://lbs.amap.com/console/ 注册一个ak,新建一个swift工程,然后在Info.plist...高德地图的库以及依赖库加入到项目里面需要的库如下截图:添加头文件具体的方式见Swift基础--调用第三
  • 直接上代码吧,功能比较简单,写出来只是...//地图类型 enum MapForm { enum MapURI:String { //百度 case baiduMap = "baidumap://" //高德 case gaodeMap = "iosamap://" //苹果 case...
  • //选择导航类型 @objc private func choiceMap() { //将User.share.coordinate的两个值改成网吧的经纬度 let alert = UIAlertController.init(title: "请选择导航应用程序", message: nil, prefe...
  • 最近收到了这么一个需求,就是支持目前主流的地图APP导航,也就是说跳转至第三方应用。说实在的一开始我是拒绝的,不过最后还是做了,全是体力活,为了方便大家,我就终结一下,以供参考: 首先是判断APP是否安装...
  • 最近在研究地图,所以就简单写了一个小 demo,给大家分享一下如何不集成SDK就能调用第三方地图app,这里只介绍苹果自带地图、百度地图和高德地图调用!其中还简单介绍了app定位功能,希望能给初学的开发者带来一点...
  • 通过url跳转到已经安装的手机app中进行导航 记得查看经纬度编码哦~ 高德 NSURL *aMapScheme = [NSURL URLWithString:@"iosamap://"]; BOOL canOpenAMap = [[UIApplication sharedApplication] canOpenURL:...
  • 这里配置就不多做解释了swift配置老是弄不好,但是利用OC编写百度地图在导包上比较方便,遂看了三天OC的编码习惯,然后用OC进行百度地图的编写了,因为百度地图的包是用OC编写的,所以用OC导报比较方便。亲测非常...
  • 高德地图官方文档:...看高德地图官方文档基本都是OC语言写的,swift也就没这么详细说明了。 这种高度自定义,用的也是oc自定义,没有给出swift版本的demo出来,所以我们想做到后面这个效果来: 气泡在iOS中又...
1 2 3 4 5 ... 20
收藏数 756
精华内容 302