2012-05-22 81 views
4

我一直在玩谷歌地圖/ Google路線API。有沒有人對我如何能夠沿着路線而不是地理中點找到中點提出了一些看法。Google Maps API - 沿路線的中點

理想情況下,我想找到這個中點的緯度和長度值。

有什麼想法?我有點難過,希望我能夠找到一個建議,而不會瘋狂地嘗試自己找到答案。

回答

0

您可以使用Gisgraphy的GetPointAtDistance原型。該原型沿折線返回指定距離的LatLng。下面的代碼:

  1. 定義折線
  2. 確定此折線
  3. 使用原型的一半長度返回中點經緯度
  4. 提取緯度以及LNG中點經緯度

var polyline = new google.maps.Polyline({ 
     path: [ new google.maps.LatLng(..., ...), 
       new google.maps.LatLng(..., ...), 
       ... ]; 
    }),                //1. 
    midDistanceLength = polyline.getPath().getLength()/2,   //2. 
    midDistanceLatLng = polyline.GetPointAtDistance(midDistanceLength),//3. 
    midDistanceLat = midDistanceLatLng.lat(),      //4. 
    midDistanceLng = midDistanceLatLng.lng();      //4. 

//The prototype from Gisgraphy: 
google.maps.Polygon.prototype.GetPointAtDistance = function(metres) { 
    // some awkward special cases 
    if (metres == 0) return this.getPath().getAt(0); 
    if (metres < 0) return null; 
    if (this.getPath().getLength() < 2) return null; 
    var dist=0; 
    var olddist=0; 
    for (var i=1; (i < this.getPath().getLength() && dist < metres); i++) { 
    olddist = dist; 
    dist += google.maps.geometry.spherical.computeDistanceBetween (
     this.getPath().getAt(i), 
     this.getPath().getAt(i-1) 
    ); 
    } 
    if (dist < metres) return null; 
    var p1= this.getPath().getAt(i-2); 
    var p2= this.getPath().getAt(i-1); 
    var m = (metres-olddist)/(dist-olddist); 
    return new google.maps.LatLng(p1.lat() + (p2.lat()-p1.lat())*m, p1.lng() + (p2.lng()-p1.lng())*m); 
} 
google.maps.Polyline.prototype.GetPointAtDistance = google.maps.Polygon.prototype.GetPointAtDistance; 
0

最簡單的方法是,您可以首先:

1)使用GMSGeometryDistance通過GMSGeometryDistance函數計算每兩個連續點之間的距離,然後對所有距離進行求和來計算路徑的總距離。

2)然後你再次計算,並在每一步中求和。當總和大約是總距離的一半時,那麼你處於中間點。 示例代碼如下:

    func findTotalDistanceOfPath(path: GMSPath) -> Double { 

        let numberOfCoords = path.count() 

        var totalDistance = 0.0 

        if numberOfCoords > 1 { 

            var index = 0 as UInt 

            while index  < numberOfCoords{ 

                //1.1 cal the next distance 

                var currentCoord = path.coordinateAtIndex(index) 

                var nextCoord = path.coordinateAtIndex(index + 1) 

                var newDistance = GMSGeometryDistance(currentCoord, nextCoord) 

                totalDistance = totalDistance + newDistance 

                index = index + 1 

             } 

        } 
return totalDistance 

    } 

func findMiddlePointInPath(path: GMSPath ,totalDistance distance:Double) -> CLLocationCoordinate2D? { 

    let numberOfCoords = path.count() 

    let halfDistance = distance/2 

    let threadhold = 10 //10 meters 

    var midDistance = 0.0 

    if numberOfCoords > 1 { 

        var index = 0 as UInt 

        while index  < numberOfCoords{ 

            //1.1 cal the next distance 

            var currentCoord = path.coordinateAtIndex(index) 

            var nextCoord = path.coordinateAtIndex(index + 1) 

            var newDistance = GMSGeometryDistance(currentCoord, nextCoord) 

            midDistance = midDistance + newDistance 

            if fabs(midDistance - halfDistance) < threadhold { //Found the middle point in route 

                return nextCoord 

            } 

            index = index + 1 

        } 

    } 
    return nil //Return nil if we cannot find middle point in path for some reason 
} 

還有更多的優化功能。我在Swift寫了一個詳細的答案here