このコードはv2にあります:
var polyline = new GPolyline([point1,point2], "#ff0000", 5);
map.addOverlay(polyline);
polyline.enableDrawing();
そしてv3で行う方法??
ありがとう
このコードはv2にあります:
var polyline = new GPolyline([point1,point2], "#ff0000", 5);
map.addOverlay(polyline);
polyline.enableDrawing();
そしてv3で行う方法??
ありがとう
Maps API v3.7 以降、この機能がついにサポートされました!!
http://code.google.com/p/gmaps-api-issues/wiki/JavascriptMapsAPIv3Changelog
残念ながら、enableDrawing/enableEditingはv3ではサポートされていません。バグトラッカーに機能リクエストがあります。
自分で実装することは可能ですが(たとえば、このデモを参照)、v2と同様に実装するのは簡単ではありません。
私は現在、この問題の解決策を自分で探しています。これまでのところ、少なくとも少し有望に見える実装は1つだけです。Polyline-enableEditing-enableDrawing-for-GMaps-API-v3です。
実装するのは大変でしたが、可能です。状態パターンを使用して、デジタル化プロセスを追跡しました。私は EXT JS を使用したので、厳密に JavaScript のものを含めようとしています。ボタンをクリックすると、デジタル化オブジェクトは、デジタル化中か、デジタル化していないか、または編集中かを追跡します。状態は、POINT、POLYLINE、POLYGON のどのジオメトリ タイプを処理する必要があるかも追跡します。状態を設定するためのボタンが利用可能でした。マップのクリックを次のようにキャプチャします。
google.maps.event.addListener(map,"click",digitizer.onDigitize.createDelegate(digitizer));
google.maps.event.addListener(map,"dblclick",digitizer.endDigitize.createDelegate(digitizer));
デジタイザー オブジェクト内で、デジタイズ ポリゴンとポイントを追跡しました。ユーザーがクリックするたびに、イベント内の latLng を追跡対象のオブジェクトに送信します。
this.digitizedGeometry.getPath().push(e.latLng);
これは、ポリラインとポリゴンの両方で機能します。このためにドーナツや複数のジオメトリではなく、単純なトポロジのみを追跡しました。
ポイントの編集と削除はより困難でした。
最初に、ユーザーが選択したジオメトリが POLYLINE か POLYGON かを追跡し、このジオメトリをデジタイザー内の editGeometry 変数に配置し、編集用のボタンを有効にする必要がありました。
編集ジオメトリのパスを循環し、さまざまなスタイルのマーカーと中間点マーカーを追加して、マーカーがドラッグ可能であることを確認しました。
var path = this.editGeometry.getPath();
for (var i = 0; i < path.getLength(); i++) {
// Add point geometry markers
var point = path.getAt(i);
var latLng = new google.maps.LatLng(point.lat(), point.lng());
var markerOptions = {position: latLng, map: mapPanel.getMap()};
Ext.apply(markerOptions, digitizer.markerStyle);
var marker = new google.maps.Marker(markerOptions);
// Used to track the latLng associated with the marker when position changes.
marker.edit = {
path: path,
position: i,
isMidpoint: false
};
google.maps.event.addListener(marker, "dragend", digitizer.applyMarkerEdit.createDelegate(mapPanel, marker, true));
google.maps.event.addListener(marker, "rightclick", digitizer.onContextMenu.createDelegate(mapPanel, marker, true));
digitizer.editHandles.push(marker);
// determine the midpoint
var nextValue = (i+1) % path.getLength();
var otherPoint = path.getAt(nextValue);
var latLng = new google.maps.LatLng((point.lat() + otherPoint.lat()) / 2.0, (point.lng() + otherPoint.lng()) / 2.0);
var markerOptions = {position: latLng, map: mapPanel.getMap()};
Ext.apply(markerOptions, digitizer.midpointMarkerStyle);
var marker = new google.maps.Marker(markerOptions);
marker.edit = {
path: path,
position: i,
isMidpoint: true
};
google.maps.event.addListener(marker, "dragend", digitizer.applyMarkerEdit.createDelegate(mapPanel, marker, true));
digitizer.editHandles.push(marker);
}
キー部分は「dragend」で、編集を適用します。それがパス内の実際のポイントである場合は、ポイントを移動して中間点を再決定します。
marker.edit.path.setAt(marker.edit.position, e.latLng);
// Adjust midpoints
var index = handles.indexOf(marker);
var prev = (index - 2 + handles.length) % handles.length;
var mpprev = (index - 1 + handles.length) % handles.length;
var next = (index + 2) % handles.length;
var mpnext = (index + 1) % handles.length;
var prevMarker = handles[prev];
var nextMarker = handles[next];
var prevMpMarker = handles[mpprev];
var nextMpMarker = handles[mpnext];
prevMpMarker.setPosition(new google.maps.LatLng((e.latLng.lat() + prevMarker.getPosition().lat()) / 2.0, (e.latLng.lng() + prevMarker.getPosition().lng()) / 2.0));
nextMpMarker.setPosition(new google.maps.LatLng((e.latLng.lat() + nextMarker.getPosition().lat()) / 2.0, (e.latLng.lng() + nextMarker.getPosition()
これは非常に複雑であることがわかります。中間点が必要ない場合は、上記のコードの最初の行で十分です。中間点の適用はより複雑です。中点をパスに追加し、すべての位置をシフトし、新しい中点を追加して前の中点を調整する必要があります。ポイントを削除したい場合は、そのポイントを削除し、ハンドルの位置を減らし、中点を削除して、前の中点を再調整する必要があります。
うまくいけば、これにより、これを行う方法についての洞察が得られます。残念ながら、2 行のコードではなく 200 行のコードですが、マーカー スタイルの設定など、好きなことを柔軟に行うことができます。