3

ポリラインをクリックすると、Googleマップのようにポリラインのリストが表示されますdoesクリックした位置にインフォーワードウィンドウが表示されます機能Googleマップのポリラインの中心(重心?)

function mapsInfoWindow(polyline, content) { 
    google.maps.event.addListener(polyline, 'click', function(event) {    
     infowindow.content = content; 
     infowindow.position = event.latLng; 
     infowindow.open(map); 
    }); 
} 

私は(そのために同じ機能を使用して)リストをクリックしたときに問題が来る、イベントは明らかに緯度経度はありませんが、私は情報ウィンドウがに表示したいですとにかく、GoogleマップのリンクI mentioned beforeのリストをクリックしたときと同じように、ポリラインの真ん中です。

試したLatLngBounds();しかし、それは、必要な中間ではなく、ポリラインが作成する領域の中心を提供します。

どうすればいいですか?

+0

私はすぐに使える解決策はありませんが、ここに手掛かりがあります:(http://rbrundritt.wordpress.com/2008/10/14/calculate-midpoint-of-polyline/)ソリューションを回答として投稿します。乾杯。 – dmitry

+0

本当に主にAPI自体がそれを助けることができるかどうか疑問に思っていました。明らかにそうではありません。私はそのリンクを見ていきます、ありがとう。 – foxx

+0

http://gis.stackexchange.com/questions/2128/algorithm-for-finding-irrregular-polygon-centroid-label-pointより多くの手がかり – foxx

答えて

4

これは(ビットハッキー)ソリューションです。

http://www.geocodezip.com/scripts/v3_epoly.jsライブラリを使用して、ポリラインの長さを数えます(さまざまな方法で)、半分に分けてepolyの.GetPointsAtDistance()関数を呼び出します。

これはLatLngポイントを返すはずですが、時にはちょっと変わったことがあり、2つのポイントを返したり、そのポイントを何らかの形で「壊れました」。あなたができる最も安全なことはおそらくこれでしょう:

var pointInHalf = polyline.GetPointsAtDistance(polylineLength); 
var pointCoordinate = new google.maps.LatLng(pointInHalf[0].lat(), pointInHalf[0].lng()); 

いいえ、何もありません。 http://www.geocodezip.com/v3_polyline_example_geodesic_proj.html

から

2

まず、距離を計算するジオメトリライブラリを使用する必要があります。ライブラリ=ジオメトリをJS呼び出しに追加します(例:

<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?libraries=geometry"></script> 

あなたのポリラインの開始点と終了点を知っていると仮定すると、あなたがこれを行うことができるようになります。

すでに開始点と終了点を知らない場合、私は推測する
var inBetween = google.maps.geometry.spherical.interpolate(startLatlng, endLatlng, 0.5); 
infowindow.position = inBetween; 

、あなたはそれをpolyline.getPath()から取り出すことができます。

+0

これは、LatLngBounds()を使用したのとまったく同じです...おそらくそれ(重心?)があなたを混乱させましたか? http://img62.imageshack.us/img62/2145/nonot.png – foxx

+0

..そしてもし私が**実際に**これをやりたいと思ったら、どちらが良いかわからない場合は、別のライブラリを含める必要があります。LatLngBounds ()には、すべてのlatLngの配列を収集し、その上にgetCenter()関数を呼び出す必要があります。どれがより効果的かを言うのは難しいです:) – foxx

+0

あなたのスクリーンショットを理解できません – duncan

4

拡張子なしとポリラインを想定したが直線です。

緯度/経度座標をポイント面(x、y)の位置に変換し、その2つの平均を計算することができます。これにより、中央のピクセル位置が得られます。この位置を地図描画のためのlatinに戻すことができます。投影を変更http://code.google.com/apis/maps/documentation/javascript/reference.html#Projection

+0

それはまっすぐな線から遠いです.. http://g.co/maps/vfb9n – foxx

+1

あなたの質問をちょっと言いましょう。 –

+0

私がちょうどあなたに与えたのとまったく同じリンクが最初の投稿にもあります;)それはまた、他の記事のほとんどで、それが直線http://img62.imageshack.us/img62/2145/nonotではないことを指摘しています。 png – foxx

2

をあなたが行う必要があり、あなたのポリラインの座標を取得するために

var startLatLng = startMarker.getPosition(); 
var endLatLng = endMarker.getPosition(); 
var startPoint = projection.fromLatLngToPoint(startLatLng); 
var endPoint = projection.fromLatLngToPoint(endLatLng); 
// Average 
var midPoint = new google.maps.Point( 
    (startPoint.x + endPoint.x)/2, 
    (startPoint.y + endPoint.y)/2); 
// Unproject 
var midLatLng = projection.fromPointToLatLng(midPoint); 
var midMarker = createMarker(midLatLng, "text"); 

詳細情報:

var widePath = new google.maps.Polyline({ 
path: waypointsCoordinates, 
strokeColor: '#3366FF', 
strokeOpacity: 0.0, 
editable: true, 
draggable: true,      
strokeWeight: 3 
}); 

と実行します。

var latLng []; 
latLng = widePath.getPath().getArray(); 
+1

4年以上経っていますが、実際にこれを行うより良い方法があると思います。 – foxx

2

はビットであるかもしれません古いものの、クリックにインフォボックスを追加してみませんか?

infowindow.setPosition(event.latLng); 
infowindow.open(this.getMap()); 

これがクリックの場合。

関連する問題