Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 891093
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 15, 20262026-05-15T13:50:09+00:00 2026-05-15T13:50:09+00:00

How do I integrate Salesforce with Google Maps? I’m just looking for information on

  • 0

How do I integrate Salesforce with Google Maps? I’m just looking for information on how to…

  1. Search for contacts in Salesforce
  2. Plot those on a google map.
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-15T13:50:09+00:00Added an answer on May 15, 2026 at 1:50 pm

    EDIT:

    Thanks to tggagne‘s comment I’ve realized that people still see this answer. The code that was here is over 2.5 years old. If you want to see it – check the history of edits.

    A lot has changed in the meantime, more mashup examples were created. Not the least of them being “SF Bus Radar” (github, youtube) app by Cory Cowgill (created on Dreamforce’11 I think).

    Nonetheless – here’s my updated example with server-side geocoding, new field of type Geolocation and usage of JSON parsers.

    It tries to cache the geocoding results in the contact records. Bear in mind it might not be ‘production-ready’ (no Google Business API key = as all our requests come out from same pool of Salesforce IP servers there might be error messages). That’s why I’ve left the client-side geocoding too.



    You’ll need to make 2 changes in your environment before checking it out:

    1. Add “Remote Site Setting” that points to https://maps.googleapis.com to enable callouts from Apex
    2. Add field “Location” in Setup -> Customize -> Contacts -> fields. Type should be “Geolocation”. I’ve selected display as decimals and precision of 6 decimal places.

      public with sharing class mapController {
      public String searchText {get;set;}
      public List<Contact> contacts{get; private set;}
      
      public static final String GEOCODING_URI_BASE = 'https://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=';
      
      // For purposes of this demo I'll geocode only couple of addresses server-side. Real code can use the commented out value.
      public static final Integer MAX_CALLOUTS_FROM_APEX = 3; // Limits.getLimitCallouts()
      
      public mapController(){
          searchText = ApexPages.currentPage().getParameters().get('q');
      }
      
      public void find() {
          if(searchText != null && searchText.length() > 1){
              List<List<SObject>> results = [FIND :('*' + searchText + '*') IN ALL FIELDS RETURNING 
                  Contact (Id, Name, Email, Account.Name,
                      MailingStreet, MailingCity, MailingPostalCode, MailingState, MailingCountry, 
                      Location__Latitude__s, Location__Longitude__s)
                  ];
              contacts = (List<Contact>)results[0];
              if(contacts.isEmpty()){
                  ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO, 'No matches for "' + searchText + '"'));
              } else {
                  serverSideGeocode();
              }
          } else {
              if(contacts != null) {
                  contacts.clear();
              }
              ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO, 'Please provide at least 2 characters for the search.'));
          }
      }
      
      public void clearGeocodedData(){
          for(Contact c : contacts){
              c.Location__Latitude__s = c.Location__Longitude__s = null;
          }
          Database.update(contacts, false);
          contacts.clear();
      }
      
      public String getContactsJson(){
          return JSON.serialize(contacts);
      }
      public String getDebugContactsJson(){
          return JSON.serializePretty(contacts);
      }
      
      private void serverSideGeocode(){
          List<Contact> contactsToUpdate = new List<Contact>();
          Http h = new Http();  
          HttpRequest req = new HttpRequest();
          req.setMethod('GET'); 
          req.setTimeout(10000);
      
          for(Contact c : contacts){
              if((c.Location__Latitude__s == null || c.Location__Longitude__s == null)){
                  String address = c.MailingStreet != null ? c.MailingStreet + ' ' : '' +
                      c.MailingCity != null ? c.MailingCity + ' ' : '' +
                      c.MailingState != null ? c.MailingState + ' ' : '' +
                      c.MailingPostalCode != null ? c.MailingPostalCode + ' ' : '' +
                      c.MailingCountry != null ? c.MailingCountry : '';
                  if(address != ''){
                      req.setEndpoint(GEOCODING_URI_BASE + EncodingUtil.urlEncode(address, 'UTF-8'));
                      try{
                          HttpResponse res = h.send(req);
                          GResponse gr = (GResponse) JSON.deserialize(res.getBody(), mapController.GResponse.class);
                          if(gr.status == 'OK'){
                              LatLng ll = gr.results[0].geometry.location;
                              c.Location__Latitude__s = ll.lat;
                              c.Location__Longitude__s = ll.lng;
                              contactsToUpdate.add(c);
                          } else {
                              ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, 'Geocoding of "' + address + '" failed:' + gr.status));
                          }
                      }catch(Exception e){
                          ApexPages.addMessages(e);
                      }
                  }
                  // Bail out if we've reached limit of callouts (not all contacts might have been processed).
                  if(Limits.getCallouts() == MAX_CALLOUTS_FROM_APEX) {
                      break;
                  }
              }
          }
          if(!contactsToUpdate.isEmpty()) {
              Database.update(contactsToUpdate, false); // some data in Developer editions is invalid (on purpose I think).
              // If update fails because "j.davis@expressl&amp;t.net" is not a valid Email, I want the rest to succeed
          }
      }
      
      // Helper class - template into which results of lookup will be parsed. Some fields are skipped!
      // Visit https://developers.google.com/maps/documentation/geocoding/#Results if you need to create full mapping.
      public class GResponse{
          public String status;
          public GComponents[] results;
      }
      public class GComponents{
         public String formatted_address;
         public GGeometry geometry;
      }
      public class GGeometry {
          public LatLng location;
      }
      public class LatLng{
          public Double lat, lng;
      }
      }
      

    <apex:page controller="mapController" tabStyle="Contact" action="{!find}" id="page">
        <head>
            <style>
                div #map_canvas { height: 400px; }
            </style>
            <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?sensor=false"></script>
        </head>
        <apex:sectionHeader title="Hello StackOverflow!" subtitle="Contact full text search + Google Maps integration" />
        <apex:pageMessages />
        <apex:form id="form">
            <apex:pageBlock id="searchBlock">
                <apex:inputText value="{!searchText}" />
                <apex:commandButton value="Search" action="{!find}"/>
                <p>Examples: <a href="/apex/{!$CurrentPage.Name}?q=USA">"USA"</a>, "Singapore", "Uni", "(336) 222-7000". If it works in the global search box, it will work here.</p>
            </apex:pageBlock>
            <apex:pageBlock title="Found {!contacts.size} Contact(s)..." rendered="{!NOT(ISNULL(contacts)) && contacts.size > 0}" id="resultsBlock">
                <apex:pageBlockButtons location="top">
                    <apex:commandButton value="Clear cached locations" title="Click if you want to set 'null' as geolocation info for all these contacts" action="{!clearGeocodedData}" />
                </apex:pageBlockButtons>
                <apex:pageBlockTable value="{!contacts}" var="c" id="contacts">
                    <apex:column headerValue="{!$ObjectType.Contact.fields.Name.label}">
                        <apex:outputLink value="../{!c.Id}">{!c.Name}</apex:outputLink>
                    </apex:column>
                    <apex:column headerValue="Address">
                        {!c.MailingStreet} {!c.MailingCity} {!c.MailingCountry}
                    </apex:column>
                    <apex:column value="{!c.Account.Name}"/>
                    <apex:column headerValue="Location (retrieved from DB or geocoded server-side)">
                        {!c.Location__Latitude__s}, {!c.Location__Longitude__s}
                    </apex:column>
                </apex:pageBlockTable>
                <apex:pageBlockSection columns="1" id="mapSection">
                    <div id="map_canvas" />
                </apex:pageBlockSection>
                <apex:pageBlockSection title="Click to show/hide what was geocoded server-side and passed to JS for further manipulation" columns="1" id="debugSection">
                    <pre>{!debugContactsJson}</pre>
                </apex:pageBlockSection>
                <pre id="log"></pre>
            </apex:pageBlock>
        </apex:form>
        <script type="text/javascript">
        twistSection(document.getElementById('page:form:resultsBlock:debugSection').childNodes[0].childNodes[0]); // initially hide the debug section
    
        var contacts = {!contactsJson};    // Array of contact data, some of them might have lat/long info, some we'll have to geocode client side
        var coords = [];                   // Just the latitude/longitude for each contact
        var requestCounter = 0;
    
        var markers = [];                  // Red things we pin to the map.
        var balloon = new google.maps.InfoWindow(); // Comic-like baloon that floats over markers.
    
        function geocodeClientSide() {
            for(var i = 0; i < contacts.length; i++) {
                if(contacts[i].Location__Latitude__s != null && contacts[i].Location__Longitude__s != null) {
                    coords.push(new google.maps.LatLng(contacts[i].Location__Latitude__s, contacts[i].Location__Longitude__s));
                } else {
                    ++requestCounter;
                    var address = contacts[i].MailingStreet + ' ' + contacts[i].MailingCity + ' ' + contacts[i].MailingCountry;
                    var geocoder = new google.maps.Geocoder();
                    if (geocoder) {
                        geocoder.geocode({'address':address}, function (results, status) {
                            if (status == google.maps.GeocoderStatus.OK) {
                                coords.push(results[0].geometry.location);
                            } else {
                                var pTag = document.createElement("p");
                                pTag.innerHTML = status;
                                document.getElementById('log').appendChild(pTag);
                            }
                            if(--requestCounter == 0) {
                                drawMap();
                            }
                        });
                    }
                }
            }
            // It could be the case that all was geocoded on server side (or simply retrieved from database).
            // So if we're lucky - just proceed to drawing the map.
            if(requestCounter == 0) {
                drawMap();
            }
        }
    
        function drawMap(){
            var mapOptions = {
                center: coords[0],
                zoom: 3,
                mapTypeId: google.maps.MapTypeId.ROADMAP
            };
            var map = new google.maps.Map(document.getElementById("map_canvas"),  mapOptions);
    
            for(var i = 0; i < coords.length; ++i){
                var marker = new google.maps.Marker({map: map, position: coords[i], title:contacts[i].Name, zIndex:i});
    
                google.maps.event.addListener(marker, 'click', function() {
                    var index = this.zIndex;
                    balloon.content = '<b>'+contacts[index].Name + '</b><br/>' + contacts[index].Account.Name + '<br/>' + contacts[index].Email;
                    balloon.open(map,this);
                });
                markers.push(marker);
            }
        }
    
        geocodeClientSide();
        </script>
    </apex:page>
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I'm looking to integrate my Salesforce implementation with an external database. I know that
I am looking to integrate Crystal Reports 2008 into a Windows Forms application. I
I am looking to integrate with sales force, hence looking at different ways on
How we can integrate PHP in Google Calender API without Zend?while i google it
I am working to integrate unit testing into the development process on the team
I'm trying to integrate running Fitnesse tests from MSBuild im my nightly build on
I'd like to integrate a Python IDLE-esque command prompt interface into an existing NI-CVI
We are trying to integrate tests in our daily builds using TestComplete, so far
I have tried to integrate the Picasa API on iPhone, compiles fine, but I
My goal is to integrate testing into my development environment (as post-build step). I

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.