折れ線編集の例

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:v="urn:schemas-microsoft-com:vml">
<head>
<script src="http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAQSM2B1R_Bj95rWgWElH1OhTqjLYwwsL-iGMxhNQyjc0XqRdw2xQRl8I7RCvZ-B4St-j-iY4sNdGP3A"
type="text/javascript" charset="UTF-8"></script>

<script type="text/javascript">//<![[
  var map, point=[], polyline;

/* 頂点クラス */
function pointObj(m,s,a) {
  this.gmarker = m;  /* gmarker */
  this.isStop = s;  /* if this is a stop, isStop=1, otherwise 0 */
  this.active = a;  /* if a =1, the point is active */
}

function onLoad() {
  map = new GMap2(document.getElementById("map"));
//  map.addControl(new GMapLargeMapControl());
  map.addControl(new GMapTypeControl());
  map.setUIToDefault();
  map.setCenter(new GLatLng(35.66808, 138.568904), 13);
  var myicon = defineIcon();

  var request = GXmlHttp.create();
  request.open("GET", "1211-9.php", true);
  request.onreadystatechange = function() {
    if (request.readyState == 4) {
      var xmlDoc = request.responseXML;

      var pointFromXml = xmlDoc.documentElement.getElementsByTagName("point");
      var prev_a = null;
      for(var i=0; i < pointFromXml.length; i++) {
        var lat = pointFromXml[i].getAttribute("lat");
        var lng = pointFromXml[i].getAttribute("lng");
        var a = new GLatLng(lat,lng);
        var s = pointFromXml[i].getAttribute("stop");
        /* 頂点配列を作る 頂点(s=1)なら大きなマーカ,それ以外の頂点は小さなマーカ */
        if(i==0 || s==1 || a.distanceFrom(prev_a)>10.0) { /* 近すぎるのは排除 */
          var iconObj = s==1? myicon.normal: myicon.tiny;
          point.push(new pointObj(new GMarker(a, { draggable: true, icon: iconObj}),s,1));
          prev_a = a; /* 一つ前のaとの距離を調べるために記憶しておく */
        }
      }
            /* ここに折れ線 polyline を書くプログラムを入れる */
      drawPolyline();
      drawMarker();
    }
  }
  request.send(null);

} /* onLoad の終わり */

function drawPolyline() { /* グローバル変数pointのデータより折れ線を描画 */
  var a = [];
  for(var i in point){  /* isActive=0は削除されたことを意味し,描かない */
    if(point[i].active) a[i] =point[i].gmarker.getLatLng();
  }
  if(polyline) map.removeOverlay(polyline); /* polylineが描かれていれば消去して描画 */
  polyline = new GPolyline(a);
  map.addOverlay(polyline);
}

function drawMarker(){ /* マーカーを表示 */
  for(var i=0; i< point.length; i++){
    var mark = point[i].gmarker;
    map.addOverlay(mark);
    GEvent.addListener(mark,"dragend",function(){/* ドラグエンドで折れ線再描画*/
                         drawPolyline();
                       });
    /* マーカクリックで,マーカを地図上から削除,pointのisActiveを0にし,再描画 */
    /* 再描画する関数redrawPolylinefuncをマーカごとに定義:番号iを与えることがポイント */
    var redrawPolylinefunc = GEvent.callbackArgs(mark, function(n) {
                                                   map.removeOverlay(this);
                                                   point[n].active = 0;
                                                   drawPolyline();
                                                 },i);
    /*マーカクリック時にredrawPolylinefucを実行するようにリスナーをつける */
    GEvent.bind(mark,"click",redrawPolylinefunc,function(){
                  this.apply(arguments);
                });
  }
}

function defineIcon() {
  var tinyIcon = new GIcon();
  tinyIcon.image = "http://labs.google.com/ridefinder/images/mm_20_red.png";
  //tinyIcon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
  tinyIcon.iconSize = new GSize(12, 20);
  //tinyIcon.shadowSize = new GSize(22, 20);
  tinyIcon.iconAnchor = new GPoint(6, 20);
  tinyIcon.infoWindowAnchor = new GPoint(5, 1);

  var  normalIcon = new GIcon();
  normalIcon.image = "http://www.google.com/mapfiles/marker.png";
  normalIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
  normalIcon.iconSize = new GSize(20,34);
  normalIcon.shadowSize = new GSize(37,34);
  normalIcon.iconAnchor = new GPoint(10,34);
  normalIcon.infoWindowAnchor = new GPoint(15,1);
  return {tiny: tinyIcon, normal: normalIcon};
}

function DisplayLatLngs() {
  var str = "<table border=1><tr><th>緯度</th><th>経度</th><th>停留所</th></tr>";
  for(i=0;i<point.length;i++) {
    if(point[i].active)
      str += "<tr><td>"
      + point[i].gmarker.getLatLng().x + "</td><td>" + point[i].gmarker.getLatLng().y
      + "</td><td>" + point[i].isStop + "</td></tr>";
  }
  document.getElementById("show").innerHTML = str + "</table>";
}
//]]>
</script>
</head>

<body onload="onLoad()">
    <div id="map" style="width:500px; height:450px"></div>

  <form> <input type="button" value="緯度経度一覧" onclick="DisplayLatLngs()"></form>
  <div id="show">
  </div>

<!--    <P>jikoku : <div id="show_jikoku"></div></P>
    <P>ido : <div id="show_ido"></div></P>
    <P>keido : <div id="show_keido"></div></P>
-->

</body>

</html>