Как использовать Google Maps с динамической формой

Я использую шаблон MVC, чтобы позволить пользователю добавлять несколько адресов. Они нажимают кнопку, и это вызывает мой шаблон с использованием jquery, и создается форма. Если они хотят добавить другое местоположение, они снова нажимают кнопку, и настраивается другая форма и так далее. Этот шаблон работает нормально, но у меня возникают проблемы с использованием Google Maps в этих шаблонах.

Причина использования Google Maps в этом сценарии — предоставить удобный интерфейс для добавления долготы и широты для добавляемого местоположения. Я использую здесь класс вместо идентификатора, так как на экране может быть любое количество адресных областей.

В моем шаблоне 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.

Любые идеи, которые я мог бы попробовать здесь? Спасибо за вашу помощь.

Спасибо,

Богатый


person Richard Reddy    schedule 12.03.2012    source источник


Ответы (3)


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>

таким образом мы можем отображать карту динамически и использовать нашу карту на нашем сайте или в других проектах. надеюсь это поможет !

person Kübra Atlı    schedule 11.01.2018

Пример кода для загрузки статической широты и долготы:

    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". Вы также можете использовать еще один важный элемент карты Google, а именно геокодер: это поможет вам нарисовать адрес на карте Google.

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);
                }
            }
    );
person Anil    schedule 12.03.2012
comment
Спасибо за ответ Анил. К сожалению, моя проблема заключается не в том, чтобы заставить карту Google отображаться один раз, а в том, чтобы отобразить ее в определенном div с классом вместо идентификатора. Мой код, кажется, находит правильный элемент, но Google Maps, похоже, не нравится, как я передаю ему этот элемент. - person Richard Reddy; 13.03.2012

Итак, после некоторых исследований стало ясно, что Google Maps работает только в том случае, если я использую идентификатор элемента. Это не сработает, если я передам ему класс.

Чтобы обойти эту проблему, мне пришлось динамически добавлять 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));
               });
           }
       });
}

Очевидно, что для приведенного выше кода все еще требуется некоторая тонкая настройка, поскольку необходимо добавить проверку ошибок и т. Д., Но, надеюсь, это поможет некоторым другим людям начать работу с Google Maps, работающими с динамическими формами.

person Richard Reddy    schedule 14.03.2012