有没有办法使用谷歌获取方向(只是路线)mkmapview?

时间:2015-07-10 04:08:17

标签: ios swift google-maps mapkit directions

我在iOS上使用swift并使用MKMapView。 我一直致力于为用户提供从 - 到文本字段,并让用户在from和to位置之间拥有一种路由形式。我使用内置的方向和Apple的地理编码api调用来研究mkmapview。然而,在使用它一段时间之后,意识到很多国家都不受Apple Apple - Supported Countries For Directions

支持

那么有没有办法从谷歌地图SDK获取路线并将它们转换为MKPolyline或MKOverlay?我还没有使用谷歌地图,所以请记住这一点。我看到这个问题iPhone: Using Google to get directions它有一个答案,但最新的解决方案是4年,它的目标是C。虽然我确实理解如何将Objective-C代码转换为swift,但我不必完成整个项目。请记住,这是一个更大的项目的一部分,所以我无法将整个事情切换到谷歌地图。

3 个答案:

答案 0 :(得分:3)

我认为this Stackoverflow answer可以将编码的折线转换为MKPolyline。

答案是Objective-C版本,所以我尝试将其转换为Swift,示例代码:

func polyLineWithEncodedString(encodedString: String) -> MKPolyline {
        let bytes = (encodedString as NSString).UTF8String
        let length = encodedString.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)
        var idx: Int = 0

        var count = length / 4
        var coords = UnsafeMutablePointer<CLLocationCoordinate2D>.alloc(count)
        var coordIdx: Int = 0

        var latitude: Double = 0
        var longitude: Double = 0

        while (idx < length) {
            var byte = 0
            var res = 0
            var shift = 0

            do {
                byte = bytes[idx++] - 0x3F
                res |= (byte & 0x1F) << shift
                shift += 5
            } while (byte >= 0x20)

            let deltaLat = ((res & 1) != 0x0 ? ~(res >> 1) : (res >> 1))
            latitude += Double(deltaLat)

            shift = 0
            res = 0

            do {
                byte = bytes[idx++] - 0x3F
                res |= (byte & 0x1F) << shift
                shift += 5
            } while (byte >= 0x20)

            let deltaLon = ((res & 1) != 0x0 ? ~(res >> 1) : (res >> 1))
            longitude += Double(deltaLon)

            let finalLat: Double = latitude * 1E-5
            let finalLon: Double = longitude * 1E-5

            let coord = CLLocationCoordinate2DMake(finalLat, finalLon)
            coords[coordIdx++] = coord

            if coordIdx == count {
                let newCount = count + 10
                let temp = coords
                coords.dealloc(count)
                coords = UnsafeMutablePointer<CLLocationCoordinate2D>.alloc(newCount)
                for index in 0..<count {
                    coords[index] = temp[index]
                }
                temp.destroy()
                count = newCount
            }

        }

        let polyLine = MKPolyline(coordinates: coords, count: coordIdx)
        coords.destroy()

        return polyLine
    }

您可以尝试this GitHub link中的示例项目。

以下是使用Google Direction API网络服务在旧金山至圣何塞的MKMapView上呈现路线的图片。

enter image description here

答案 1 :(得分:0)

使用google api查找出发地和目的地之间的路线。

必填参数:

  • origin:lat +长当前位置或地点ID

  • 目的地:lat +长目的地位置或地点ID

  • 关键:创建新的google api密钥。

可选参数:

  • 模式(默认为驾驶)驾驶为您提供更多选项,或设置
    步行,骑自行车,过境。
  • alternative:false只给出一条路线,选项true给出原点和目的地之间的所有方向,然后你可以选择哪一条 路线你想要持续时间或腿内距离。

然后使用折线库将点(在overview_polyline内)转换为CLLocationCoordinate2D列表 的 https://github.com/raphaelmor/Polyline

喜欢这样:

  

func convertPointToCoordinates() - &gt; [CLLocationCoordinate2D]? {

     

让polyline = Polyline(encodedPolyline:overviewPolyline.points ??“”)

     

返回polyline.coordinates

     

}

     

让coordinates = convertPointToCoordinates()

     

让polyLine = MKPolyline(coordinates:coordinates ?? [],count :( coordinates?.count ?? 0))

  • 在地图视图上添加折线:

      

    self.mapView.add(折线)

  • 专注于折线区域:

      

    self.mapView.setVisibleMapRect(polyLine.boundingMapRect,edgePadding:UIEdgeInsets.init(top:60,left:60,bottom:60,right:60),animated:true)

答案 2 :(得分:0)

Swift 3 版本,略显浓缩,感谢 ztan

如果您想在没有Google SDK的情况下在iOS中使用Googles地理折线。

function InsertData {
    Param (
    [string]$username,
    [string]$fullname,
    [string]$email,
    [string]$phone
    )
    $DBServer = "SERVERNAME"
    $DBName = "Tool"
    $sqlConnection = New-Object System.Data.SqlClient.SqlConnection
    $sqlConnection.ConnectionString = "Server=$DBServer;Database=$DBName;Integrated Security=False;User Id = User;password = password"
    $sql = "INSERT INTO Employee (LocationId,FullName,username,email,phone,EquipId,SystemDetailId,migrationdate,UAT,bdpaccess) VALUES ('" + $location + "','" + $fullname + "','" + $username + "','" + $email + "','" + $phone + "',5,4," + $migrationdate + ",False,False)"

    $sqlCommand = New-Object System.Data.SqlClient.SqlCommand
    $sqlCommand.Connection = $sqlConnection

    $sqlCommand.CommandText = $sql

    write-host $sql
    $sqlConnection.Open()
    $sqlCommand.ExecuteNonQuery()
    $sqlConnection.Close()
}