PolylineとclickしたポイントにMarker表示するメモ

地図でクリックした場所のMarkerを表示、クリックした位置情報をTableにも表示する。

[save to json]ボタンでファイルに保存するのはJavaFXで実装する予定、、、

  • sample.html
<!DOCTYPE html>
<html>
    <head>
        <title>Google Map Polyline Sample</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="stylesheet" type="text/css" href="sample.css" />
        <script src="https://maps.googleapis.com/maps/api/js?v=3.exp"></script>
        <script src="jquery.js"></script>
        <script src="sample.js"></script>
    </head>
    <body>
        <div id="map_canvas"></div>
        <div>
            <table>
                <thead>
                    <tr>
                        <td class="latlngNo">No</td>
                        <td class="latlng">Latitude</td>
                        <td class="latlng">Longitude</td>
                        <td class="description">Description</td>
                        <td class="linecolor">Color</td>
                        <td class="btn">delete</td>
                    </tr>
                </thead>
                <tbody id="points"></tbody>
            </table>
        </div>
        <div><button type="button" id="saveBtn" >save to json</button></div>
    </body>
</html>
  • sample.js
/*
 * sample.js
 */
var map;
var infos = [
    {place: 'KIX', lat: 34.4342, lng: 135.2328},
    {place: 'SFO', lat: 37.6189, lng: -122.3750}
];

/*
 * initialize
 */
$(function(){
   // init map
   initMap();
   // regist [save to json] button event
   $('#saveBtn').on('click', saveJson);
   // regist map event
   google.maps.event.addListener(map, "click", addPoints);
});

/*
 * initialize google map
 */ 
function initMap(){
    var mapCanvas = document.getElementById("map_canvas");
    var kixLatLng = infos[0];
    var myLatlng = new google.maps.LatLng(kixLatLng.lat, kixLatLng.lng);
    var mapOptions = {
        zoom: 12,
        center: myLatlng
    };
    map = new google.maps.Map(mapCanvas, mapOptions);
    var bounds = new google.maps.LatLngBounds();
    var paths = [];
    infos.forEach(function(info){
        var myLatlng = new google.maps.LatLng(info.lat, info.lng);
        bounds.extend(myLatlng);
        var marker = new google.maps.Marker({
            position: myLatlng,
            map: map,
            title:info.place
        });
        paths.push(myLatlng);
    });
    //  set zoom
    map.fitBounds(bounds);
    // draw KIX-SFO Polyine
    var polylineOpt = {
        map: map,
        path:paths,
        editable:true
    };
    new google.maps.Polyline(polylineOpt);    
}

/*
 * add point to map
 */
function addPoints(event){
    var myLatlng = event.latLng;
    var infoOptions = {
        latlng:myLatlng
    };
    pointsInfo.addPoint(infoOptions);
    // add latest point to table 
    addTr(pointsInfo.getPoint());
}

/*
 * add tr element to table
 */
function addTr(pointObj){    
    var tbody = $('#points');
    var tr = $('<tr>');
    tr.appendTo(tbody);
    $('<td>').text(pointObj.pointNo+1).addClass("latlngNo").appendTo(tr);
    $('<td>').text(pointObj.lat).addClass("latlng").appendTo(tr);
    $('<td>').text(pointObj.lng).addClass("latlng").appendTo(tr);
    // description
    var tdDesc = $('<td>').addClass("description");
    $('<input>').addClass("inputDesc").val(pointObj.desc)
            .attr('selno', pointObj.pointNo)
            .change(function(event){
                var inDesc = $(this);
                // set desc
                var selNo = inDesc.attr('selno');
                pointsInfo.setDesc(selNo, inDesc.val());
            })
            .appendTo(tdDesc);
    tdDesc.appendTo(tr);
    // linecolor
    var tdColor = $('<td>').addClass("linecolor");
    $('<input>').attr('type', 'color').val(pointObj.color).addClass("inputColor")
            .attr('selno', pointObj.pointNo)
            .change(function(event){
                var inColor = $(this);
                // set color
                var selNo = inColor.attr('selno');
                pointsInfo.setColor(selNo, inColor.val());
            })
            .appendTo(tdColor);
    tdColor.appendTo(tr);
    // delete Button
    var tdBtn = $('<td>').addClass("btn");
    $('<input>').attr('type', 'button').addClass("inputBtn").attr('value', 'delete')
            .attr('deleteno', pointObj.pointNo)
            .click(function(event){
                var delBtnObj = $(this);
                // remove tr
                var parentTr = delBtnObj.parent().parent();
                parentTr.remove();
                // delete pointsInfo
                var delNo = delBtnObj.attr('deleteno');
                pointsInfo.deletePoint(delNo);
                pointsInfo.deleteMarker(delNo);
            })
            .appendTo(tdBtn);
    tdBtn.appendTo(tr);
    // create marker
    pointsInfo.addMarker(pointObj);
}
/*
 * point information 
 */
var pointsInfo = {
    pointNo:-1,
    // pointNo, lat, lng, desc, color, latlng, isDeleted
    infoList:[],
    markers:[],
    getPoint:function(selNo){
        if (selNo){
            return this.infoList[selNo];
        } else {
            return this.infoList[this.pointNo];
        }
    },
    addPoint:function(info){
        this.pointNo++;
        var infoObj = {
            isDeleted:false
        };
        infoObj.pointNo = this.pointNo;
        if (info.latlng){
            infoObj.lat = info.latlng.lat();
            infoObj.lng = info.latlng.lng();
            infoObj.latlng = info.latlng;
        }
        if (info.desc){
            infoObj.desc = info.desc;
        } else {
            infoObj.desc = '';
        }
        if (info.lat){
            infoObj.lat = info.lat;
        }
        if (info.lng){
            infoObj.lng = info.lng;
        }
        if (info.color){
            infoObj.color = info.color;
        } else {
            infoObj.color = '#000000';
        }
        // this infoObj has pointNo, lat, lng, desc, color, latlng, isDeleted
        this.infoList.push(infoObj);
    },
    addMarker:function(pointObj){
        var marker = new google.maps.Marker({
            position: pointObj.latlng,
            map: map,
            title:String(pointObj.pointNo+1)
        });        
        this.markers.push(marker);
    },
    setColor:function(selNo, selColor){
        var info = this.infoList[selNo];
        info.color = selColor;
    },
    setDesc:function(selNo, inDesc){
        var info = this.infoList[selNo];
        info.desc = inDesc;
    },
    deletePoint:function(delNo){
        //this.infoList.splice(delNo, 1); // remove line from array
        this.infoList[delNo].isDeleted = true;
    },
    deleteMarker:function(delNo){
        this.markers[delNo].setMap(null);
    },
    getInfoList:function(){
        return this.infoList;
    }
};
/*
 * [save to json] button event
 */        
function saveJson(){
    // call java method
    var infos = JSON.stringify(pointsInfo.infoList);
    app.getInfoList(infos);
}