4

私は Google マップ/Google 方向 API をいじっています。地理的な中間点ではなく、ルートに沿った中間点をどのように見つけることができるかについて、誰もが気がかりなことはありますか?

理想的には、この中間点の緯度と経度の値を見つけたいと思います。

何かご意見は?私は少し困惑しており、自分で答えを見つけようと夢中になることなく提案を見つけることができることを願っています.

4

2 に答える 2

0

最も簡単な方法は、最初に次のことを行うことです。

1) GMSGeometryDistance 関数を使用して後続の 2 点ごとの距離を計算し、すべての距離を合計して、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で詳細な回答を書きました

于 2015-05-21T04:32:56.423 に答える
0

Gisgraphy のGetPointAtDistanceプロトタイプを使用できます。プロトタイプは、ポリラインに沿った指定された距離の LatLng を返します。次のコード:

  1. ポリラインを定義する
  2. このポリラインの半分の長さを決定する
  3. プロトタイプを使用して中点の LatLng を返します
  4. 中点LatLngからLatと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;
于 2014-08-14T11:37:32.663 に答える