0

我使用 MVC 模板来允许用户添加多个地址。他们单击一个按钮,这将使用 jquery 调用我的模板并生成表单。如果他们想添加另一个位置,他们再次单击该按钮并设置另一个表单,依此类推。此模板工作正常,但我在这些模板中使用 Google 地图时遇到了一些问题。

在这种情况下使用谷歌地图的原因是提供一个很好的界面来为您添加的位置添加经度和纬度。我在这里使用类而不是 id,因为屏幕上可能有任意数量的地址区域。

在我的 mvc 模板中,我有以下标记:

<div class="body">
           <div class="st-form-line">   
                <span class="st-labeltext">Location</span>
                <a href="#" class="GetPosition">Get Latitude &amp; Longitude positions based on above address details.</a>
                <div class="mapContainer" style="display:none;">
                    <p>If the map position is incorrect simply drag the pointer to the correct location.</p>
                    <div class="map" style="width: 450px; height: 350px;"><br/></div>
                </div>
                <div class="clear"></div>
            </div>

            <div class="st-form-line">  
                <span class="st-labeltext">@Html.LabelFor(model => model.Address.Longitude)</span>
                @Html.EditorFor(model => model.Address.Longitude)
                @Html.ValidationMessageFor(model => model.Address.Longitude)
                <div class="clear"></div>
            </div>

            <div class="st-form-line">  
                <span class="st-labeltext">@Html.LabelFor(model => model.Address.Latitude)</span>
                @Html.EditorFor(model => model.Address.Latitude)
                @Html.ValidationMessageFor(model => model.Address.Latitude)
                <div class="clear"></div>
            </div>
</div>

我有以下 jquery (这是给我一个问题的位):

$('a.GetPosition').live("click", function (evt) {
        evt.preventDefault();
        $(this).next().show();
        var mapElement = $(this).closest('.body').find('.map');
        var latElement = $(this).closest('.body').find('[id$=__Address_Latitude]');
        var longElement = $(this).closest('.body').find('[id$=__Address_Longitude]');
        showAddress(mapElement, latElement, longElement);
    });

    // Google Map
    var map;
    function showAddress(mapElement, latElement, longElement) {
        var myLatlng = new google.maps.LatLng(40.713956, -74.006653);

        var myOptions = {
            zoom: 8,
            center: myLatlng,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        }
        map = new google.maps.Map(mapElement, myOptions);

        var marker = new google.maps.Marker({
            draggable: true,
            position: myLatlng,
            map: map,
            title: "choose location"
        });

        google.maps.event.addListener(marker, 'click', function (event) {
            latElement.val(event.latLng.lat().toFixed(5));
            longElement.val(event.latLng.lng().toFixed(5));
        });
    }

现在,我只是在默认地图位置“40.713956,-74.006653”中进行硬编码,但是一旦我可以正确显示地图,我就会将其更改为使用真实世界的地址。

我知道问题出在“mapElement”上,但我不确定出了什么问题。如果我评论我们的 showAddress 函数调用并将一些文本输出到 mapElement 中,我可以看到文本,因此它似乎确实找到了正确的 dom 位置。

我可以在这里尝试任何想法吗?谢谢你的帮助。

谢谢,

富有的

4

3 回答 3

2

MapController 看起来像这样:

public ActionResult Index()
        {

            string markers = "[";
            string conString = ConfigurationManager.ConnectionStrings["PTS"].ConnectionString;
            SqlCommand cmd = new SqlCommand("SELECT * FROM Project");
            using (SqlConnection con = new SqlConnection(conString))
            {
                cmd.Connection = con;
                con.Open();
                using (SqlDataReader sdr = cmd.ExecuteReader())
                {
                    while (sdr.Read())
                    {
                        markers += "{";
                        markers += string.Format("'title': '{0}',", sdr["projecttitle"]);
                        markers += string.Format("'address': '{0}',", sdr["address"]);
                        markers += string.Format("'lat': '{0}',", sdr["latitude"]);
                        markers += string.Format("'lng': '{0}',", sdr["longitude"]);
                        markers += string.Format("'description': '{0}'", sdr["explanation"]);
                        markers += "},";
                    }
                }
                con.Close();
            }

            markers += "];";
            ViewBag.Markers = markers;
             return View();
        }

项目:你的数据库表名 | 标题、地址、描述:您想在地图上显示的信息

索引视图如下所示:

@model PTS.Models.Project

@{

ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}

<html>
<head>
    <style>
        .angular-google-map-container {
            height: 300px;
            box-shadow: 2px 2px 3px 3px lightgrey;
        }

        .angular-google-map {
            width: 80%;
            height: 100%;
            margin: auto 0px;
        }
    </style>
    <title>Simple Map</title>
    <meta name="viewport" content="initial-scale=1.0">
    <meta charset="utf-8">
    <script src="http://code.jquery.com/jquery-1.12.2.min.js"></script>
    <script src="https://maps.googleapis.com/maps/api/js?key=yourmapkey&libraries=places"></script>
    <style>
        html, body {
            height: 100%;
            margin: 0;
            padding: 0;
        }

        #map {
            height: 100%;
            width: 1500px;
        }
    </style>


    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <br /><br />


    <style>
        #content {
            border: 1px solid black;
            margin-top: 2px;
            background-image: url('/Content/images/infowindow.jpg');
            /*background: #098;*/
            color: #FFF;
            font-family: Verdana, Helvetica, sans-serif;
            font-size: 12px;
            padding: .1em 1em;
            -webkit-border-radius: 2px;
            -moz-border-radius: 2px;
            border-radius: 2px;
            text-shadow: 0 -1px #000000;
            -webkit-box-shadow: 0 0 8px #000;
            box-shadow: 0 0 8px #000;
        }
    </style>


    <script>

        var markers = @Html.Raw(ViewBag.Markers);
        function myMap() {
            var mapCanvas = document.getElementById("map");

            var mapOptions = { center: new google.maps.LatLng(markers[0].lat, markers[0].lng), zoom: 8,
                mapTypeId: google.maps.MapTypeId.ROADMAP };
            var map = new google.maps.Map(mapCanvas, mapOptions);

            for (i = 0; i < markers.length; i++) {
                var data = markers[i]
                var myLatlng = new google.maps.LatLng(data.lat, data.lng);
                var marker = new google.maps.Marker({
                    position: myLatlng,
                    map: map,
                    title: data.title
                });

                var cityCircle = new google.maps.Circle({
                    strokeColor: '#FF0000',
                    strokeOpacity: 0.8,
                    strokeWeight: 2,
                    fillColor: '#FF0000',
                    fillOpacity: 0.35,
                    map: map,
                    center: myLatlng,
                    radius: 19999.45454,
                    position: myLatlng,
                    draggable:false
                });
                 var contentString = '<div id="content">' +
                                       '<b> Project Title : </b> '  + 
         data.title+ '</div>' + '<div id="content">'+
                                       '<b> Address : </b> '  + data.address 
         + '</div>' +  '<div id="content">' + '<b> Explanation  : </b> '   + data.description + '</div>' +  '</div>' ;


                var infowindow = new google.maps.InfoWindow({
                    content: contentString
                });


                marker.infowindow = infowindow;

                marker.addListener('click', function() {
                    return this.infowindow.open(map, this);
                })


                google.maps.event.addListener(marker, 'click', function() {
                    this.infowindow.open(map, this);
                });
            }
        }


    </script>

    <div id="map" style="width: 1500px; height: 1000px"></div>
    <script src="https://maps.googleapis.com/maps/api/js?key=yourmapkey&callback=myMap"></script>


</body>
</html>

通过这种方式,我们可以动态显示地图并在我们的网站或其他项目中使用我们的地图。希望这可以帮助 !

于 2018-01-11T12:04:42.867 回答
0

加载静态 Lat 和 Lng 的示例代码:

    var initialLocation = new google.maps.LatLng(40.713956, -74.006653);
    var zoom = 4;

        var options = {
            zoom: zoom,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        }
        map = new google.maps.Map(document.getElementById("map_canvas"), options);
        map.setCenter(initialLocation);
        map.setZoom(zoom);

上面的示例将在您的 div“map_canvas”上显示静态地图。您还可以使用谷歌地图的一个更重要的元素,即地理编码器:这将帮助您在谷歌地图上绘制地址

var mygc = new google.maps.Geocoder();
mygc.geocode({ 'address': address },
    function (results, status) {
                if (status == google.maps.GeocoderStatus.OK) {
                    initialLocation = new google.maps.LatLng(results[0].geometry.location.lat(), results[0].geometry.location.lng());

                    map.setCenter(initialLocation);
                    map.setZoom(zoom);
                }
            }
    );
于 2012-03-12T13:15:00.203 回答
0

所以在做了一些研究之后,很明显谷歌地图只有在我使用元素 id 时才有效。如果我通过它一堂课,它就不起作用。

为了解决这个问题,当单击显示地图的按钮时,我必须动态添加一个具有唯一 ID 的 div。

我的 HTML 如下所示:

    <div class="body">
        <div class="st-form-line">  
                   <span class="st-labeltext">Location</span>
                   <a href="#" class="GetPosition">Get Latitude &amp; Longitude positions based on above address details.</a>
                   <div class="mapContainer" style="display:none;">
                   <p>If the map position is incorrect simply drag the pointer to the correct location.</p>
                   <p>@Html.LabelFor(model => model.Address.Longitude) @Html.EditorFor(model => model.Address.Longitude) @Html.LabelFor(model => model.Address.Latitude) @Html.EditorFor(model => model.Address.Latitude) <br /> 
                   @Html.ValidationMessageFor(model => model.Address.Longitude) @Html.ValidationMessageFor(model => model.Address.Latitude)</p><br />
                   <div class="clear"></div>
               </div>
         </div>
     </div>  

JavaScript 看起来像这样:

var i = 1;
    $('a.GetPosition').live("click", function (evt) {
        evt.preventDefault();
        // build up address string for map
        var address = //added my address textboxes here - removed for brevity;
        // find the map container and make it visible
        var mapContainer = $(this).next();
        mapContainer.show();
        // create a new map div with unique id
        var mapId = 'map' + i++;
        $("<div></div>").attr("id", mapId).attr("style", "width: 600px; height: 350px;").appendTo(mapContainer);
        // find the lat long textboxes and pass to the Google map function so we can populate with co-ordinates
        var latElement = $(this).closest('.body').find('[id$=__Address_Latitude]');
        var longElement = $(this).closest('.body').find('[id$=__Address_Longitude]');
        showAddress(mapId, address, latElement, longElement);
        // finally hide the button to avoid other map divs being generated
        $(this).hide();
    });
var map;
var marker;
function showAddress(mapId, address, latElement, longElement) {

    var map = new google.maps.Map(document.getElementById(mapId), {
        mapTypeId: google.maps.MapTypeId.ROADMAP,
        zoom: 15
    });

    var geocoder = new google.maps.Geocoder();
    geocoder.geocode({
        'address': address
    },
       function (results, status) {
           if (status == google.maps.GeocoderStatus.OK) {
               marker = new google.maps.Marker({
                   draggable: true,
                   position: results[0].geometry.location,
                   map: map
               });
               map.setCenter(results[0].geometry.location);
               latElement.val(results[0].geometry.location.lat().toFixed(5));
               longElement.val(results[0].geometry.location.lng().toFixed(5));

               google.maps.event.addListener(marker, 'dragend', function (event) {
                   latElement.val(event.latLng.lat().toFixed(5));
                   longElement.val(event.latLng.lng().toFixed(5));
               });
           }
       });
}

显然,由于需要添加错误检查等,上述代码仍然需要进行一些微调,但希望这将有助于其他一些人开始让谷歌地图使用动态表单。

于 2012-03-14T14:39:16.700 回答