`

[IOS]整合google map并获取当前位置

    博客分类:
  • IOS
阅读更多

1.下载Google map的sdk,详情参考:

Get Started

2.准备好SDK后,展示map这些问题都不大,稍微难点的是定位当前位置

可以参考google的git tutorial:

https://github.com/googlemaps/maps-sdk-for-ios-samples/tree/master/tutorials

 

同时可以参考:

iOS之集成GoogleMap(定位、搜索)需要注意的事:http://www.cocoachina.com/cms/wap.php?action=article&id=21868
3.我的示例代码:
import UIKit
import GoogleMaps
import GooglePlaces

let screenH = UIScreen.main.bounds.size.height
let screenW = UIScreen.main.bounds.size.width

class BookController: UIViewController,UITableViewDelegate,UITableViewDataSource {
    
    //MARK:UI widget
    @IBOutlet weak var googleMapView: UIView!
    @IBOutlet weak var merchantTable: UITableView!
    @IBOutlet weak var searchBarView: UIView!
    
    //MARK:Others
    var merchantList: Array<MerchantBookDetail> = []
    
    //MARK: Google map
    var placesClient: GMSPlacesClient!
    var locationManager = CLLocationManager()
    var currentLocation: CLLocation?
    var mapView: GMSMapView?
    var zoomLevel: Float = 16.0
    
    // An array to hold the list of likely places.
    var likelyPlaces: [GMSPlace] = []
    
    // The currently selected place.
    var selectedPlace: GMSPlace?
    
    // A default location to use when location permission is not granted.
    let defaultLocation = CLLocation(latitude: -33.869405, longitude: 151.199)
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        initData()
        initView()
        
    }

    func initData()  {
        
        merchantList = initMerchant()
        
        placesClient = GMSPlacesClient.shared()
        // Initialize the location manager.
        locationManager = CLLocationManager()
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.requestAlwaysAuthorization()
        locationManager.distanceFilter = 50
        locationManager.startUpdatingLocation()
        locationManager.delegate = self
        
    }
    
    func initView()  {
        loadGoogleMap()
        
        //table
        merchantTable.delegate = self
        merchantTable.dataSource = self
        merchantTable.separatorStyle = UITableViewCellSeparatorStyle.none
        
        
    }
    
    func initMerchant() -> Array<MerchantBookDetail> {
        let merchant_one = MerchantBookDetail(merchant: "般咸道35号地下\n电话:2297 3377")
        let merchant_two = MerchantBookDetail(merchant: "尖沙咀金马伦道12号\n恒信商业大厦l字全层\n电话:3422 8855")
        
        let merchantList : [MerchantBookDetail] = [merchant_one,merchant_two];
        
        return merchantList
    }
    
    // Update the map once the user has made their selection.
    @IBAction func unwindToMain(segue: UIStoryboardSegue) {
        // Clear the map.
        mapView?.clear()
        
        // Add a marker to the map.
        if selectedPlace != nil {
            let marker = GMSMarker(position: (self.selectedPlace?.coordinate)!)
            marker.title = selectedPlace?.name
            marker.snippet = selectedPlace?.formattedAddress
            marker.map = mapView
        }
        
        listLikelyPlaces()
    }
    
    // Populate the array with the list of likely places.
    func listLikelyPlaces() {
        // Clean up from previous sessions.
        likelyPlaces.removeAll()
        
        placesClient.currentPlace(callback: { (placeLikelihoods, error) -> Void in
            if let error = error {
                // TODO: Handle the error.
                print("Current Place error: \(error.localizedDescription)")
                return
            }
            
            // Get likely places and add to the list.
            if let likelihoodList = placeLikelihoods {
                for likelihood in likelihoodList.likelihoods {
                    let place = likelihood.place
                    self.likelyPlaces.append(place)
                }
            }
        })
    }
    
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    @IBAction func selectBtnAction(_ sender: Any) {
        
        let bookSelectVC:BookSelectController = UIStoryboard.init(name: "Book", bundle: nil).instantiateViewController(withIdentifier: "book-select") as! BookSelectController
        
        self.navigationController?.pushViewController(bookSelectVC, animated: true)
        
    }
    
     func loadGoogleMap() {
        // Create a GMSCameraPosition that tells the map to display the
        let camera = GMSCameraPosition.camera(withLatitude: defaultLocation.coordinate.latitude,
                                              longitude: defaultLocation.coordinate.longitude,
                                              zoom: zoomLevel)
        let rect = CGRect(x: 0, y: 0, width: googleMapView.frame.width, height: googleMapView.frame.height)
        mapView = GMSMapView.map(withFrame: rect, camera: camera)
        mapView?.settings.myLocationButton = true
        mapView?.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        mapView?.isMyLocationEnabled = true
        mapView?.settings.compassButton = true
        googleMapView.backgroundColor = UIColor.clear
        // Add the map to the view, hide it until we've got a location update.
        googleMapView.addSubview(mapView!)
//        mapView?.isHidden = true
        listLikelyPlaces()
        
        googleMapView.addSubview(searchBarView)
        
        
    }

    func safeAreaInsetmap(view: UIView) -> UIEdgeInsets {
        if #available(iOS 11, *) {
            return view.safeAreaInsets
        }
        return UIEdgeInsets.zero
    }
    
    //MARK:table view API
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return merchantList.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let row = indexPath.row
        let cellId = "book_map_cell"
        let cell: BookMapTableCellTableViewCell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! BookMapTableCellTableViewCell
        
        let merchant = merchantList[row]
        
        cell.merchantDetail.text = merchant.merchantDetail
        cell.merchantImage.image = UIImage.init(named: "merchantImage_\(row+1)")
        
        return cell
    }
}


// Delegates to handle events for the location manager.
extension  BookController: CLLocationManagerDelegate {
    
    // Handle incoming location events.
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let location: CLLocation = locations.last!
        print("Location: \(location)")
        
        let camera = GMSCameraPosition.camera(withLatitude: location.coordinate.latitude,
                                              longitude: location.coordinate.longitude,
                                              zoom: zoomLevel)
        let position2D = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)
        let marker = GMSMarker(position: position2D)
        marker.map = self.mapView
        
        if (mapView?.isHidden)! {
            mapView?.isHidden = false
            mapView?.camera = camera
        } else {
            mapView?.animate(to: camera)
        }
        
        listLikelyPlaces()
    }
    
    // Handle authorization for the location manager.
    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        switch status {
        case .restricted:
            print("Location access was restricted.")
        case .denied:
            print("User denied access to location.")
            // Display the map using the default location.
            mapView?.isHidden = false
        case .notDetermined:
            print("Location status not determined.")
        case .authorizedAlways: fallthrough
        case .authorizedWhenInUse:
            print("Location status is OK.")
        }
    }
    
    // Handle location manager errors.
    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        locationManager.stopUpdatingLocation()
        print("Error: \(error)")
    }
}
 



 

  • 大小: 657.8 KB
分享到:
评论

相关推荐

    VeloParis GoogleMap地图源码_ios源码

    在这个项目中,开发者使用了Swift编程语言,结合Google Maps SDK for iOS,构建了一个用户友好的界面,展示巴黎各个自行车站点的位置、可用自行车数量以及空闲停车位等实时数据。 首先,我们来了解一下Google Maps ...

    StreetView实现街景_ios源码下载

    本文将详细解析如何利用Google Maps SDK for iOS来实现街景功能,并结合提供的"StreetView"源码下载,帮助开发者深入理解并实践这一技术。 首先,我们需要在项目中集成Google Maps SDK。这可以通过CocoaPods或手动...

    MapCurlEffect GoogleMap地图源码_ios源码

    MapCurlEffect GoogleMap地图源码是iOS平台上用于实现类似翻页效果的地图应用开发资源。在iOS开发中,GoogleMap SDK提供了丰富的功能,允许开发者在应用程序中集成地图、定位、路线规划等功能。MapCurlEffect这个...

    SeismicXML GoogleMap地图源码_ios源码

    通过深入研究SeismicXML的源码,开发者不仅可以学习到如何在iOS应用中整合Google Maps,还能掌握XML解析、数据绑定、异步处理等核心编程概念。这对于希望构建类似应用或提升iOS开发技能的开发者来说是一个宝贵的资源...

    Google Map for Iphone

    谷歌地图(Google Map)是全球广泛使用的地图服务,其iOS版(适用于iPhone和iPad)为用户提供了强大的定位、导航、路线规划等功能。这篇文章将深入探讨谷歌地图在iPhone平台上的特点、功能以及使用技巧。 一、基本...

    googlemap.zip

    标题“googlemap.zip”暗示了这个压缩包可能包含与Google地图相关的文件。描述中的内容为空,所以我们只能基于标题和标签来推断可能包含的知识点。标签“map”进一步确认了这个压缩包与地图服务或者地图数据有关。 ...

    World Map Globe Edition 2 V14.5

    -从当前位置找到并顺利飞往任何国家、州、市。还可以通过经纬度轻松定位任何世界位置。 -比例尺为110.00.000:1和30.000.000:1的两级边界详图。 -虚线:绘制纬度、经度和光标线。 -基于物理的大气散射着色器,提供...

    IOS应用源码——WorldCities.rar

    同时,为了提供城市信息,源码可能还引用了网络API,如Google Maps或OpenStreetMap的数据,通过JSON格式获取和解析城市数据。 其次,iOS应用的用户界面(UI)是吸引用户的关键。在这个项目中,开发者可能采用了...

    map111111.zip

    它们可以与各种地图服务提供商(如Google Maps、OpenStreetMap等)集成,获取地图瓦片并显示在界面上。通过设置地图中心点、缩放级别和视图方向,可以实现地图的浏览和导航功能。 5. **地理编码与反地理编码**: ...

    Google API应用

    总之,Google API 提供了强大的工具,让开发者能够轻松地将 Google 的服务整合到自己的应用中,为用户提供更多功能和价值。通过学习和掌握 Google API 的使用,开发者可以极大地扩展其应用的可能性。

    谷歌地图软件源代码下载

    虽然谷歌地图的完整源代码可能无法直接获取,但通过学习相关技术和工具,开发者可以创建出具有类似功能的应用,并在此过程中提升自身的技术能力。同时,开源社区中有很多类似的项目,如OpenStreetMap,可以提供实践...

    flutter-openstreetmap-example

    4. **地图插件集成**:学习如何在 Flutter 中引入第三方库(如 openstreetmap_plugin),并将其整合到应用中。 5. **自定义地图标记和覆盖物**:了解如何在地图上添加自定义图标、标注,以及实现点击事件监听等交互...

    ES6-Ionic-Map-App:ES6离子映射应用程序

    周期图简单的事故记录工具科技类古尔普浏览器玉巴别塔角度的谷歌地图离子性智威汤逊套接字本地设置sudo npm install -g离子科尔多瓦sudo npm安装gulp js 离子发球离子模拟iOS完毕当前位置搜索地址地图剩下要做在应用...

    meteor-cordova-native-map:基于 Meteor Cordova 的项目的本地地图组件

    2. 配置地图服务:根据选择的地图提供商(如Google Maps API),获取API密钥并进行配置。这通常涉及到在项目的配置文件中添加API密钥,或者在代码中动态设置。 3. 使用组件:在Meteor的模板文件中,引入地图组件,...

    TMapViews:适用于Xamarin和MvvmCross的Android和iOS地图视图

    安装方式获取最新的并将其安装在您的核心和平台解决方案上。 Install-Package TMapViews发牌TMapViews是根据获得。 TMapViews是基于的和 。 MVVMCross用于下的TMapViews.MvxPlugins.Bindings.Droid和TMapViews....

    Android手机操作系统培训2PPT学习教案.pptx

    3. **无缝结合Google应用**:作为Google主导研发的操作系统,Android与Google的各项服务如Google Map、Gmail、Google Talk等深度融合,使用户在手机上也能便捷地使用这些互联网服务。 二、Android版本演进 Android...

    谷歌师兄的leetcode刷题笔记-APO-DZ-Android:适用于AlphaPhiOmega的DeltaZetaChapter的自适应A

    应用程序旨在将这些资源整合到智能手机上,并且能够访问现有的云模块,以便兄弟们可以快速检查他们的服务进度、在公共日历上报告和创建事件,并且(最有帮助,所以我们听说)很容易找到并联系我们分会的其他成员。...

    Qt MapView

    例如,可以设置地图的中心坐标、缩放级别,以及选择不同的地图提供者(如OpenStreetMap、Google Maps等)。 2. **地图提供者(QGeoMapServiceProvider)**:Qt支持多种地图服务提供商,每个提供商都有自己的地图...

    swift-在CoreML之上运行Inception-v3

    6. **处理结果**: 预测完成后,根据`classLabelProbabilities`返回的数组,我们可以获取每个类别的概率,并选择概率最高的类别作为预测结果。 通过以上步骤,我们就可以在Swift的Core ML框架上成功运行Inception-v3...

    ionicMapz:离子地图移动应用程序的开发

    Ionic提供了$cordovaGeolocation服务,用于获取设备的当前位置。结合地图API,可以实现地图上的实时定位: ```javascript $cordovaGeolocation .getCurrentPosition() .then(function (position) { var latLng =...

Global site tag (gtag.js) - Google Analytics