1

GeoPortalと呼ばれる Google Maps Geometry のプラグインを使用して、建物の屋根で測定を行っています。

プラグインをアプリケーションで正常に動作させました。入力された住所から動的に作成された前のページの経度と緯度を取得します。

私が抱えている問題は、人々がアプリケーションを前後にナビゲートできるようにする必要があることです。つまり、エリア プロットを記憶する必要があるため、そのページに戻ったときにエリアを毎回再描画する必要はありません。

例では、人がページに戻ったときのために、このプロット レイアウトを覚えておく必要があります。

ここに画像の説明を入力

私のコードは次のとおりです。

jQuery

var map;

var measure = {
    mvcLine: new google.maps.MVCArray(),
    mvcPolygon: new google.maps.MVCArray(),
    mvcMarkers: new google.maps.MVCArray(),
    line: null,
    polygon: null
};

jQuery(document).ready(function() {

    map = new google.maps.Map(document.getElementById("map"), {
        zoom: 21,
        center: new google.maps.LatLng(51.502378,-0.114348),
        mapTypeId: google.maps.MapTypeId.HYBRID,
        draggableCursor: "crosshair" 
    });


    google.maps.event.addListener(map, "click", function(evt) {
        measureAdd(evt.latLng);
    });

});


function measureAdd(latLng) {

    var marker = new google.maps.Marker({
        map: map,
        position: latLng,
        draggable: true,
        raiseOnDrag: false,
        title: "Drag me to change shape",
        icon: new google.maps.MarkerImage("http://maps.co.mecklenburg.nc.us/geoportal/img/measure-vertex.png", new google.maps.Size(9, 9), new google.maps.Point(0, 0), new google.maps.Point(5, 5))
    });

    measure.mvcLine.push(latLng);
    measure.mvcPolygon.push(latLng);

    measure.mvcMarkers.push(marker);

    var latLngIndex = measure.mvcLine.getLength() - 1;

    google.maps.event.addListener(marker, "mouseover", function() {
        marker.setIcon(new google.maps.MarkerImage("http://maps.co.mecklenburg.nc.us/geoportal/img/measure-vertex-hover.png", new google.maps.Size(15, 15), new google.maps.Point(0, 0), new google.maps.Point(8, 8)));
    });

    google.maps.event.addListener(marker, "mouseout", function() {
        marker.setIcon(new google.maps.MarkerImage("http://maps.co.mecklenburg.nc.us/geoportal/img/measure-vertex.png", new google.maps.Size(9, 9), new google.maps.Point(0, 0), new google.maps.Point(5, 5)));
    });

    google.maps.event.addListener(marker, "drag", function(evt) {
        measure.mvcLine.setAt(latLngIndex, evt.latLng);
        measure.mvcPolygon.setAt(latLngIndex, evt.latLng);
    });

    google.maps.event.addListener(marker, "dragend", function() {
        if (measure.mvcLine.getLength() > 1) {
            measureCalc();
        }
    });

    if (measure.mvcLine.getLength() > 1) {

        if (!measure.line) {

            measure.line = new google.maps.Polyline({
                map: map,
                clickable: false,
                strokeColor: "#FF0000",
                strokeOpacity: 1,
                strokeWeight: 3,
                path:measure. mvcLine
            });

        }

        if (measure.mvcPolygon.getLength() > 2) {

            if (!measure.polygon) {

                measure.polygon = new google.maps.Polygon({
                    clickable: false,
                    map: map,
                    fillOpacity: 0.25,
                    strokeOpacity: 0,
                    paths: measure.mvcPolygon
                });

            }

        }

    }

    if (measure.mvcLine.getLength() > 1) {
        measureCalc();
    }

}

function measureCalc() {

    var length = google.maps.geometry.spherical.computeLength(measure.line.getPath());
    jQuery("#span-length").text(length.toFixed(1))

    if (measure.mvcPolygon.getLength() > 2) {
        var area = google.maps.geometry.spherical.computeArea(measure.polygon.getPath());
        jQuery("#span-area").text(area.toFixed(1));
        document.getElementById('RoofArea').value = area.toFixed(1); 
        document.getElementById('submit').disabled = false;
    }


}

function measureReset() {

    if (measure.polygon) {
        measure.polygon.setMap(null);
        measure.polygon = null;
    }
    if (measure.line) {
        measure.line.setMap(null);
        measure.line = null
    }

    measure.mvcLine.clear();
    measure.mvcPolygon.clear();

    measure.mvcMarkers.forEach(function(elem, index) {
        elem.setMap(null);
    });
    measure.mvcMarkers.clear();

    jQuery("#span-length,#span-area").text(0);
    document.getElementById('submit').disabled = true;

}

HTML/CSS

<style>
    #map {
    width: 500px;
    height: 400px;
    margin: 0 auto; 
    border: 5px solid #2F4B9E;
    }
</style>

<div>
    <div id="map"></div>
    <p>Length (red line): <span id="span-length">0</span> mt<br />
    Area (grey area): <span id="span-area">0</span> mt&sup2;<br /> 
    <a href="javascript:measureReset();">Reset Measure</a></p>
</div>

jsフィドル

4

2 に答える 2

0

私は実際に自分の質問に答えたので、この質問を締めくくるために、ここに私の解決策を投稿します。私もColdFusionを使っていました。

関数では、measureAdd()このコードブロックを以下に追加しました measure.mvcMarkers.push(marker);

var toJSON = JSON.stringify(latLng);
var toOutput = $.parseJSON(toJSON);

    $.ajax({
        type: "POST",
        url: "panels_plot.cfc",
        data: {
            method: "setLatLon",
            theLat: toOutput.$a,
            theLon: toOutput.ab
        },
        dataType: "json"
    });

私が作成したこの.cfcに投稿された

<cfcomponent>
  <cffunction name="setLatLon" access="remote">
    <cfargument name="theLat" type="any" required="yes">
    <cfargument name="theLon" type="any" required="yes">
    <cfif NOT IsDefined('SESSION.latLon')>
        <cfset SESSION.latLon = ArrayNew(1)> 
    </cfif>
    <cfset st = StructNew()> 
    <cfset st.theLat = theLat>
    <cfset st.theLon = theLon>
    <cfset ArrayAppend(SESSION.latLon, st)>
  </cffunction>
</cfcomponent>

次に、 の最初の宣言のすぐ上に、mapこれを追加しましたcfloop

    <cfif IsDefined('SESSION.latLon')>
        <cfloop from="1" to="#ArrayLen(SESSION.latLon)#" index="i">
            <cfoutput>
            var jsonObj = new google.maps.LatLng(#SESSION.latLon[i].theLat#, #SESSION.latLon[i].theLon#);

            var marker#i# = new google.maps.Marker({
                map: map,
                position: jsonObj,
                draggable: true,
                raiseOnDrag: false,
                title: "Drag me to change shape",
                icon: new google.maps.MarkerImage("../admin/measure-vertex.png", new google.maps.Size(9, 9), new google.maps.Point(0, 0), new google.maps.Point(5, 5))
            });

            measure.mvcLine.push(jsonObj);
            measure.mvcPolygon.push(jsonObj);

            measure.mvcMarkers.push(marker#i#);

            var latLngIndex#i# = measure.mvcLine.getLength() - 1;

            google.maps.event.addListener(marker#i#, "mouseover", function() {
                marker#i#.setIcon(new google.maps.MarkerImage("../admin/measure-vertex-hover.png", new google.maps.Size(15, 15), new google.maps.Point(0, 0), new google.maps.Point(8, 8)));
            });

            google.maps.event.addListener(marker#i#, "mouseout", function() {
                marker#i#.setIcon(new google.maps.MarkerImage("../admin/measure-vertex.png", new google.maps.Size(9, 9), new google.maps.Point(0, 0), new google.maps.Point(5, 5)));
            });

            google.maps.event.addListener(marker#i#, "drag", function(evt) {
                measure.mvcLine.setAt(latLngIndex#i#, evt.latLng);
                measure.mvcPolygon.setAt(latLngIndex#i#, evt.latLng);

            });

            google.maps.event.addListener(marker#i#, "dragend", function() {
                if (measure.mvcLine.getLength() > 1) {
                    measureCalc();
                }
            });

            if (measure.mvcLine.getLength() > 1) {

                if (!measure.line) {

                    measure.line = new google.maps.Polyline({
                        map: map,
                        clickable: false,

                    });

                }

                if (measure.mvcPolygon.getLength() > 2) {

                    if (!measure.polygon) {

                        measure.polygon = new google.maps.Polygon({
                            clickable: false,
                            map: map,
                            strokeColor: "##FF0000",
                            strokeOpacity: 1,
                            strokeWeight: 3,
                            paths: measure.mvcPolygon
                        });

                    }

                }

            }

            if (measure.mvcLine.getLength() > 1) {
                measureCalc();
            }
            </cfoutput>
        </cfloop>
    </cfif>

これで問題はうまく解決しました。

于 2012-11-14T11:12:59.627 に答える
0

ログイン システムを作成し、すべてをデータベースに格納するべきではありませんか? それを行う能力がない場合は、HTML5 のローカル ストレージを調べることができます。

ここにチュートリアルがあります: http://diveintohtml5.info/storage.html

于 2012-11-12T13:39:36.460 に答える