Вопрос по map-directions, google-maps-api-3 – API Карт Google - средняя точка маршрута [дубликат]

4

This question already has an answer here:

Midpoint of route in google maps 1 answer

Я играл с API Карт Google / Google. Кто-нибудь знает, как мне найти среднюю точку маршрута, а не географическую середину.

В идеале я хотел бы найти значения широты и долготы этой средней точки.

Какие-нибудь мысли? Я немного озадачен и надеюсь, что смогу найти предложение, не сходя с ума, пытаясь найти ответ сам.

Ваш Ответ

2   ответа
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 вВот

0

Вы можете использовать прототип GetPointAtDistance изGisgraphy, Прототип возвращает LatLng для указанного расстояния вдоль ломаной линии. Следующий код:

Define a polyline Determine the half length of this polyline Use the prototype to return the midpoint LatLng Extract Lat and Lng from the midpoint LatLng
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;

Похожие вопросы