Coldfusion + Google Map API v3 - информационное окно и установка границ - PullRequest
1 голос
/ 06 октября 2010

Просто мне кажется, что я могу написать код, который либо создает кликабельный маркер для всплывающего окна infoWindow, ИЛИ получает границы возвращенных маркеров и сбрасывает экстент карты и уровни масштабирования. Я не могу объединить их. Мой пример ниже прекрасно установит экстент карты в соответствии с результатами запроса. Но я не совсем знаю, как включить событие addListener в маркер, учитывая, как структурирован мой цикл, и что в var mapOptions, я установил center: gbounds.getCenter (). Эти две проблемы, кажется, усложняют мою возможность добавлять события на карту или маркер.

    <cfquery name="myquery" datasource="xxxx">
       SELECT name, lat, long
       FROM tblMain
    </cfquery>

    <cfset bridgeCoord=arrayNew(1)>

    <cfloop query="myquery">
   <cfset bridge[CurrentRow] = structNew()>
   <cfset bridge[CurrentRow].lat=lat>
       <cfset bridge[CurrentRow].long=longX>
          <cfset bridge[CurrentRow].name=name>
     </cfloop>



     <script>
       $(document).ready(function() {
       var gbounds = new google.maps.LatLngBounds();
        var markers = [];


       <cfloop index="mi" array="#bridge#">
           <cfoutput> 
               //make the point
               var point = new google.maps.LatLng(#mi.lat#,#mi.long#);
               gbounds.extend(point);
               //make the marker
               var marker = new google.maps.Marker({position: point, title:"#mi.name#"});
               markers[markers.length] = marker; 
            </cfoutput>
       </cfloop>

              var mapOptions = {
                    zoom:3,
                    mapTypeControl: true,
                    mapTypeControlOptions: {
                    style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
                       },
                     mapTypeId:google.maps.MapTypeId.ROADMAP,
                     center:gbounds.getCenter()
                        };



        var map = new google.maps.Map(document.getElementById('myMap'), mapOptions);

           map.fitBounds(gbounds);

           for(var i=0; i<markers.length; i++) markers[i].setMap(map);

      });

Кстати, я также пытался организовать часть кода, как показано ниже. это прекрасно работает для добавления события click к маркеру , но тогда я не могу использовать свой центр: элементы gbounds.getCenter () или map.fitBounds () б / в сначала устанавливаются mapOptions и передается новой переменной карты, и gbounds не был определен этой точкой. Жесткое кодирование широты / долготы по центру: кажется, просто держит его там.

       function initialize() {

    var gbounds = new google.maps.LatLngBounds();    


  var myOptions = {
    zoom: 4,
    center: new google.maps.LatLng(39.0,-94.1),
    mapTypeControl: true,
    mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU},
    navigationControl: true,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  }
  map = new google.maps.Map(document.getElementById("myMap"),
                                myOptions);

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

  // Add markers to the map
  // Set up three markers with info windows 

    <cfloop index="mi" array="#bridge#">
        <cfoutput>

             //make the point
               var point = new google.maps.LatLng(#mi.lat#,#mi.long#);
            gbounds.extend(point);
            //make the marker
               var marker = createMarker(point, "#mi.name#", "#mi.name#")

        </cfoutput>
    </cfloop>


}
 map.fitBounds(gbounds);;

function createMarker(latlng, tip, html) {
    var contentString = html;
    var marker = new google.maps.Marker({
        position: latlng,
        title: tip,
        map: map,
        });

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


var infowindow = new google.maps.InfoWindow(
  { 
    size: new google.maps.Size(150,50)
  });

ОБНОВЛЕНИЕ 10/12 : Получил это на работу. В коде Тайлера действительно есть опечатка, но она незначительна. Я не уверен, насколько хорошо я могу взять этот код и расширить его, так как я не очень разбираюсь в jQuery, но это только начало. Одна вещь, с которой я не борюсь, это то, как бороться с картой, когда возвращаются нулевые маркеры. Возможно в моем запросе, что никакие записи не могут быть возвращены. То, что происходит, - то, что карта рисует, но она центрирована и увеличена в середине океана. Я полагал, что по умолчанию это должен быть центр, который я настроил (центр: новый google.maps.LatLng (39, -94.1), но это не так.

Replace: 

var $markers = $container.find(".map-marker");

with

var $markers = $container.find(".mapMarker");

Ответы [ 2 ]

1 голос
/ 07 октября 2010

EDIT

На самом деле я только что имел дело с этим месяц или около того назад, вот немного измененного кода из того, что мне помогло сделать его более похожим на ваш.

Google Maps API v3 и jQuery 1.4.2 (хотя это должно работать в любом случае с любой версией jQuery, и перенос его на прямой javascript или другую библиотеку должен быть приятным)

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
<script src="http://maps.google.com/maps/api/js?sensor=false" type="text/javascript"></script>

<cfquery name="mi" datasource="xxxx">
SELECT name, lat, long, content
FROM tblName
</cfquery>

<ul id="mapMarkers">
<cfoutput query="mi">
    <li class="mapMarker" data-latitude="#mi.lat#" data-longitude="#mi.long#">
        <div class="info-window">
        <h1 class="name">#mi.name#</a></h1>
        <div class="content">#mi.content#</div>
        </div>
    </li>
</cfoutput>
</ul>
<div id="map"></div>

<script type="text/javascript">
$(function() {
    var $container = $("#mapMarkers");

    var $map = $("#map");
    var $markers = $container.find(".map-marker");

    var bounds = new google.maps.LatLngBounds();
    var infowindow = new google.maps.InfoWindow({
        maxWidth: 300
    });

    var gmap = new google.maps.Map($map[0], {
        zoom: 8
        , mapTypeId: google.maps.MapTypeId.ROADMAP
    });

    $markers.each(function(){
        $this = $(this);
        var latitude = $this.attr("data-latitude");
        var longitude = $this.attr("data-longitude");
        var content = $this.find(".info-window").remove().html();
        var latlng = new google.maps.LatLng(latitude, longitude);

        bounds.extend(latlng);

        var marker = new google.maps.Marker({
            position: latlng
            , map: gmap
        });

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

        google.maps.event.addListener(gmap, 'click', function() {
            infowindow.close();
        });

        $this.click(function(e, el) {
            e.preventDefault();

            infowindow.setContent(content);
            infowindow.open(gmap, marker);
        })
    });

    if($markers.length > 1)
        gmap.fitBounds(bounds);
    else
        gmap.setCenter(bounds.getCenter());

    $container.hide();
});
</script>

КОНЕЦ РЕДАКТИРОВАНИЯ

Сначала вы должны переместить карту и mapOptions наверх. Затем внутри вашего цикла просто добавьте addListener на карту для маркера:

<cfloop index="mi" array="#bridge#">
   <cfoutput> 
       //make the point
       var point = new google.maps.LatLng(#mi.lat#,#mi.long#);
       gbounds.extend(point);
       //make the marker
       var marker = new google.maps.Marker({position: point, title:"#JSStringFormat(mi.name)#", map:map});
       google.maps.event.addListener(marker, 'click', function() {
           infowindow.setContent("#JSStringFormat(mi.content)#");
           infowindow.open(this.map, this);
       });
       markers[markers.length] = marker; 
    </cfoutput>
</cfloop>

Что следует отметить:

Я добавил JSStringFormat к переменным имени и содержимого.

В создании маркера есть опция карты, в которую вы можете просто добавить "map: map", чтобы вам не пришлось запускать цикл for внизу.

Кроме того, поскольку вы сейчас создаете карту перед маркерами, вы перемещаете параметры масштабирования и центра вниз.

if(markers.length > 1)  
    map.fitBounds(gbounds);  
else  
    map.setCenter(gbounds.getCenter());  

Также однажды последняя вещь:

вместо

markers[markers.length] = marker;

Вы можете использовать это

markers.push(marker); 
0 голосов
/ 07 октября 2010

Я не уверен, в чем проблема, но вам, возможно, будет легче отлаживать (и расширять), если вы распутаете свой код JavaScript и ColdFusion. Вы можете написать всю логику карты в JS, а затем использовать CF для создания данных (массив lat / lng / title), которые JS будет обрабатывать.

<script>
// Data For Map Logic
var points = [];
<cfloop query="...">
  <cfoutput>
    points.push({lat: #db_lat#, lng: #db_lng#, etc...});
  </cfoutput>
</cfloop>

// Logic for setting map extent and creating pop-ups
for (var i = 0; i < points.length; i++) {
  // do your magic
}
</script>

Используя этот подход, вы можете полностью исключить CF и базу данных во время тестирования путем жесткого кодирования массива точек.

...