2016-06-13 3 views
-1

Ich habe diese Frage ursprünglich in Salesforce StackExchange gestellt, wurde aber hier umgeleitet, da es sich eher um eine Google API-Frage als eine Salesforce-Frage handelt.Google API zum Zuordnen von Eigenschaften in der Nähe in Salesforce

Im Moment habe ich den folgenden Code, der eine Markierung am Ort der Eigenschaft auf einer Visualforce-Seite mit einer eingebetteten Google Map erstellt. Wenn der Benutzer auf die Markierung klickt, wird ein Infofenster mit Informationen zur Eigenschaft angezeigt.

<apex:page standardController="Property__c"> 
    <head> 
     <script type="text/javascript" src="https://maps.google.com/maps/api/js?sensor=false"></script> 
     <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> 
     <script type="text/javascript"> 
      $(document).ready(function() { 
       var myOptions = { 
        zoom: 18, 
        mapTypeId: google.maps.MapTypeId.HYBRID, 
        mapTypeControl: true, 
        scrollwheel: false 
       } 
       var map; 
       var marker; 
       var geocoder = new google.maps.Geocoder(); 
       var address = "{!Property__c.Property_Address__c}, " + "{!Property__c.City__c}, " + "{!Property__c.State__c} " + "{!Property__c.Zip_Postal_Code__c}}"; 
       var infowindow = new google.maps.InfoWindow({ 
        content: "<b>{!Property__c.Name}</b><br>{!Property__c.Property_Address__c}<br>{!Property__c.City__c}, {!Property__c.State__c} {!Property__c.Zip_Postal_Code__c}" 
       }); 
       geocoder.geocode({ 
        address: address 
       }, function(results, status) { 
        if (status == google.maps.GeocoderStatus.OK && results.length) { 
         if (status != google.maps.GeocoderStatus.ZERO_RESULTS) { 
          //create map 
          map = new google.maps.Map(document.getElementById("map"), myOptions); 
          map.setTilt(45); 
          //center map 
          map.setCenter(results[0].geometry.location); 
          //create marker 
          marker = new google.maps.Marker({ 
           position: results[0].geometry.location, 
           map: map, 
           title: "{!Property__c.Name}" 
          }); 
          //add listeners 
          google.maps.event.addListener(marker, 'click', function() { 
           infowindow.open(map, marker); 
          }); 
          google.maps.event.addListener(infowindow, 'closeclick', function() { 
           map.setCenter(marker.getPosition()); 
          }); 
         } 
        } else { 
         $('#map').css({ 
          'height': '15px' 
         }); 
         $('#map').html("Oops! {!Property__c.Name}'s billing address could not be found, please make sure the address is correct."); 
         resizeIframe(); 
        } 
       }); 
       function resizeIframe() { 
        var me = window.name; 
        if (me) { 
         var iframes = parent.document.getElementsByName(me); 
         if (iframes && iframes.length == 1) { 
          height = document.body.offsetHeight; 
          iframes[0].style.height = height + "px"; 
         } 
        } 
       } 
      }); 
     </script> 
     <style> 
      #map { 
       font-family: Arial; 
       font-size: 12px; 
       line-height: normal !important; 
       height: 800px; 
       background: transparent; 
      } 
     </style> 
    </head> 
    <body> 
     <div id="map"></div> 
    </body> 
</apex:page> 

Das funktioniert gut. Aber ich versuche, es zu ändern, um auch Eigenschaften in der Nähe dieser Eigenschaft anzuzeigen. Ich bin soweit gekommen, eine SOQL-Abfrage zu verwenden, um diese Eigenschaften zu finden, ihre Adressen in ein Array zu übertragen, diese Adressen zu geocodieren und an jeder Geo-Koordinate eine Markierung zu setzen. Das alles funktioniert nur anschwellen.

Wo ich steckengeblieben bin, wird das Infowindow angezeigt, das erscheint, wenn der Benutzer auf einen dieser Marker klickt. Ich kann nicht nur ein Infowindow für die NEUEN Marker erstellen, sondern auch das Infowindow für den ALTEN "Haupt" -Marker. Selbst wenn ich die Infofenster- und Listener-Ereignisse für die neuen Marker kommentiere, ist das Original immer noch gebrochen. Diese Infofenster müssen andere Informationen als das Infofenster für den "Haupt" -Marker anzeigen. Hier ist meine modifizierte Code:

$(document).ready(function() { 
    var myOptions = { 
     zoom: 18, 
     mapTypeId: google.maps.MapTypeId.HYBRID, 
     mapTypeControl: true, 
     scrollwheel: false 
    } 
    var map; 
    var marker; 
    var marker2; 
    var geocoder = new google.maps.Geocoder(); 
    var address = "{!Property__c.Property_Address__c}, " + "{!Property__c.City__c}, " + "{!Property__c.State__c} " + "{!Property__c.Zip_Postal_Code__c}}"; 
    var infowindow = new google.maps.InfoWindow({ 
     content: "<b>{!Property__c.Name}</b><br>{!Property__c.Property_Address__c}<br>{!Property__c.City__c}, {!Property__c.State__c} {!Property__c.Zip_Postal_Code__c}" 
    }); 
    geocoder.geocode({ 
     address: address 
    }, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK && results.length) { 
      if (status != google.maps.GeocoderStatus.ZERO_RESULTS) { 
       //create map 
       map = new google.maps.Map(document.getElementById("map"), myOptions); 
       map.setTilt(45); 
       //center map 
       map.setCenter(results[0].geometry.location); 
       //create marker 
       marker = new google.maps.Marker({ 
        position: results[0].geometry.location, 
        map: map, 
        title: "{!Property__c.Name}" 
       }); 
       //add listeners 
       google.maps.event.addListener(marker, 'click', function() { 
        infowindow.open(map, marker); 
       }); 
       google.maps.event.addListener(infowindow, 'closeclick', function() { 
        map.setCenter(marker.getPosition()); 
       }); 
       //several markers 
       //Get Geos 
       var geos = []; 
       var idy = 0; < 
       apex: repeat value = "{!getgeoList}" 
       var = "m" > 
       geos[idy++] = "{!m}"; < 
       /apex:repeat> 
       for (var i = 0; i < geos.length; ++i) { 
        console.log('geo' + geos[i] + 'out of' + geos.length); 
        geocodeAddress(geos[i]); 
       } 
       function geocodeAddress(location) { 
        geocoder.geocode({ 
         'address': location 
        }, function(results, status) { 
         // alert(status); 
         if (status == google.maps.GeocoderStatus.OK) { 

          // alert(results[0].geometry.location+location); 

          createMarker(results[0].geometry.location, location); 
         } else { 
          alert("some problem in geocode" + status); 
         } 
        }); 
       } 
       function createMarker(latlng, html) { 
        marker2 = new google.maps.Marker({ 
         position: latlng, 
         map: map 
        }); 

        addIinfo(marker2, html); 
       } 
       function addInfo(marker2, html) { 
        var infowindow2 = new google.maps.InfoWindow({ 
         content: html 
        }); 
        marker2.addListener(marker2, 'click', function() { 
         infowindow2.open(marker2.get('map'), marker2); 
        }); 
       } 
      } 
     } else { 
      $('#map').css({ 
       'height': '15px' 
      }); 
      $('#map').html("Oops! {!Property__c.Name}'s billing address could not be found, please make sure the address is correct."); 
      resizeIframe(); 
     } 
    }); 
    function resizeIframe() { 
     var me = window.name; 
     if (me) { 
      var iframes = parent.document.getElementsByName(me); 
      if (iframes && iframes.length == 1) { 
       height = document.body.offsetHeight; 
       iframes[0].style.height = height + "px"; 
      } 
     } 
    } 
}); 
+0

Bitte geben Sie eine [Minimal, Complete, geprüft und Lesbare Beispiel] (http://stackoverflow.com/help/mcve), der das Problem demonstriert. Der veröffentlichte Code weist mehrere Syntaxfehler auf. – geocodezip

+0

Wo sind diese Syntaxfehler? Das wäre großartig, wenn das Problem so einfach wäre. Es ist oft schwierig, solche JavaScript-Syntaxfehler in Visualforce zu erfassen. – MRG

+0

Ich habe 'marker2.addListener' in 'google.maps.event.addListener' geändert und die Infoboxen funktionieren jetzt! Ein Problem allerdings. Die Infobox für Marker sollte sich von der für Marker2 unterscheiden. Gerade jetzt zeigen alle dasselbe. Wenn ich dieses Problem lösen kann, sollte mein Code ordnungsgemäß funktionieren. In meinem Code gab es keine Syntaxfehler, zumindest keine, die dazu führten, dass es nicht funktionierte oder von Firebug abgefangen wurde. – MRG

Antwort

0

Ich änderte marker2.addListener-google.maps.event.addListener. Dies funktionierte, außer dass mein ursprünglicher Marker die gleichen Informationen wie die marker2 Marker zeigte. Als ich das marker2-Symbol in blau änderte, erkannte ich, dass dies daran lag, dass es einen marker2-Marker über den ursprünglichen Marker legte. Also habe ich in meiner for-Schleife zu i=1 gewechselt, und jetzt funktioniert mein Code einfach super! :)

Hier ist mein neuer Code:

$(document).ready(function() { 
     var myOptions = { 
      zoom: 18, 
      mapTypeId: google.maps.MapTypeId.HYBRID, 
      mapTypeControl: true, 
      scrollwheel: false 
     } 
     var map; 
     var marker; 
     var marker2; 

     var geocoder = new google.maps.Geocoder(); 
     var address = "{!Property__c.Property_Address__c}, " + "{!Property__c.City__c}, " + "{!Property__c.State__c} " + "{!Property__c.Zip_Postal_Code__c}}"; 

     var infowindow = new google.maps.InfoWindow({ 
       content: "<b>{!Property__c.Name}</b><br>{!Property__c.Property_Address__c}<br>{!Property__c.City__c}, {!Property__c.State__c} {!Property__c.Zip_Postal_Code__c}" 

     }); 
     geocoder.geocode({ 
      address: address 
     }, function(results, status) { 
      if (status == google.maps.GeocoderStatus.OK && results.length) { 
       if (status != google.maps.GeocoderStatus.ZERO_RESULTS) { 
        //create map 
        map = new google.maps.Map(document.getElementById("map"), myOptions); 
        map.setTilt(45); 
        //center map 
        map.setCenter(results[0].geometry.location); 
        //create marker 
        marker = new google.maps.Marker({ 
         position: results[0].geometry.location, 
         map: map, 
         title: "{!Property__c.Name}" 
        }); 
        //add listeners 
        google.maps.event.addListener(marker, 'click', function() { 
         infowindow.open(map, marker); 
        }); 
        google.maps.event.addListener(infowindow, 'closeclick', function() { 
         map.setCenter(marker.getPosition()); 
        }); 
        //several markers 
        //Get Geos 
        var geos = []; 
var idy=0; 
<apex:repeat value="{!getgeoList}" var="m"> 
geos[idy++]="{!m}"; 
</apex:repeat> 

        for (var i = 1; i < geos.length; ++i) { 
         console.log('geo' + geos[i] + 'out of' + geos.length); 
         geocodeAddress(geos[i]); 
        } 
        function geocodeAddress(location) { 
         geocoder.geocode({ 
          'address': location 
         }, function(results, status) { 
          // alert(status); 
          if (status == google.maps.GeocoderStatus.OK) { 

           // alert(results[0].geometry.location+location); 

           createMarker(results[0].geometry.location, location); 
          } else { 
           alert("some problem in geocode" + status); 
          } 
         }); 
        } 
        function createMarker(latlng, html) { 
         marker2 = new google.maps.Marker({ 
          position: latlng, 
          map: map, 
          icon:'http://maps.google.com/mapfiles/ms/icons/blue-dot.png' 
         }); 

         addInfo(marker2,html); 
        } 




        function addInfo(marker2,html) { 
         var infowindow2 = new google.maps.InfoWindow({ 
          content: html       }); 

        google.maps.event.addListener(marker2, 'click', function() { 
         infowindow2.open(map, marker2); 
        }); 



        } 
       } 
      } else { 
       $('#map').css({ 
        'height': '15px' 
       }); 
       $('#map').html("Oops! {!Property__c.Name}'s billing address could not be found, please make sure the address is correct."); 
       resizeIframe(); 
      } 
     }); 
     function resizeIframe() { 
      var me = window.name; 
      if (me) { 
       var iframes = parent.document.getElementsByName(me); 
       if (iframes && iframes.length == 1) { 
        height = document.body.offsetHeight; 
        iframes[0].style.height = height + "px"; 
       } 
      } 
     } 
    }); 
Verwandte Themen