私は Google マップ/Google 方向 API をいじっています。地理的な中間点ではなく、ルートに沿った中間点をどのように見つけることができるかについて、誰もが気がかりなことはありますか?
理想的には、この中間点の緯度と経度の値を見つけたいと思います。
何かご意見は?私は少し困惑しており、自分で答えを見つけようと夢中になることなく提案を見つけることができることを願っています.
私は Google マップ/Google 方向 API をいじっています。地理的な中間点ではなく、ルートに沿った中間点をどのように見つけることができるかについて、誰もが気がかりなことはありますか?
理想的には、この中間点の緯度と経度の値を見つけたいと思います。
何かご意見は?私は少し困惑しており、自分で答えを見つけようと夢中になることなく提案を見つけることができることを願っています.
最も簡単な方法は、最初に次のことを行うことです。
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で詳細な回答を書きました
Gisgraphy のGetPointAtDistanceプロトタイプを使用できます。プロトタイプは、ポリラインに沿った指定された距離の 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;