You need to sign in to do that
Don't have an account?
Sugandhi Verma
I'm getting the records by search but not the gmap of their addresses.
Hii,
I have a page and class.I have the field location of geolocation type.I want to show the location on GMAP when i search for a particular thing.Like when i select 'India', i am getting the records of having address in India But not getting their location on GMAP.
My code is:
Page:
<apex:page controller="tourmapController1" tabStyle="Accomodation__c" 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=true"></script>
</head>
<apex:sectionHeader title="Hello StackOverflow!" subtitle="Accomodation 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 {!accod.size} Accomodation__c..." rendered="{!NOT(ISNULL(accod)) && accod.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 accomodations" action="{!clearGeocodedData}" />
</apex:pageBlockButtons>
<apex:pageBlockTable value="{!accod}" var="a" id="accod">
<apex:column headerValue="{!$ObjectType.Accomodation__c.fields.Name.label}">
<apex:outputLink value="../{!a.Id}">{!a.Name}</apex:outputLink>
</apex:column>
<apex:column headerValue="Address">
{!a.Street_Address__c} {!a.City__c} {!a.Country__c}
</apex:column>
<apex:column value="{!a.Accomodation_Name__c}"/>
<apex:column headerValue="Location (retrieved from DB or geocoded server-side)">
{!a.Location__Latitude__s}, {!a.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>{!debugAccomodationJson}</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 accod = {!accodJson};
var coords = [];
var requestCounter = 0;
var markers = []; // Red things we pin to the map.
var balloon = new google.maps.InfoWindow();
function geocodeClientSide() {
for(var i = 0; i < accod.length; i++) {
if(accod[i].Location__Latitude__s != null && accod[i].Location__Longitude__s != null) {
coords.push(new google.maps.LatLng(accod[i].Location__Latitude__s, accod[i].Location__Longitude__s));
} else {
++requestCounter;
var address = accod[i].Street_Address__c + ' ' + accod[i].City__c + ' ' + accod[i].Country__c;
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();
}
});
}
}
}
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:accod[i].Name, zIndex:i});
google.maps.event.addListener(marker, 'click', function() {
var index = this.zIndex;
balloon.content = '<b>'+accod[index].Name + '</b><br/>' + accod[index].Accomodation_Name__c + '<br/>' + accod[index].City__c;
balloon.open(map,this);
});
markers.push(marker);
}
}
geocodeClientSide();
</script>
</apex:page>
Class:
public with sharing class tourmapController1 {
public String accodJson { get; set; }
public String searchText {get;set;}
public List<Accomodation__c> accod{get; private set;}
public static final String GEOCODING_URI_BASE = 'https://maps.googleapis.com/maps/api/geocode/json?sensor=true&address=';
public static final Integer MAX_CALLOUTS_FROM_APEX = 3; // Limits.getLimitCallouts()
public tourmapController1(){
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
Accomodation__c (Id, Name,Accomodation_Name__c,
Street_Address__c,City__c,PostalCode__c, State__c, Country__c,
Location__Latitude__s, Location__Longitude__s)
];
accod = (List<Accomodation__c>)results[0];
if(accod.isEmpty()){
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO, 'No matches for "' + searchText + '"'));
} else {
serverSideGeocode();
}
} else {
if(accod != null) {
accod.clear();
}
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO, 'Please provide at least 2 characters for the search.'));
}
}
public void clearGeocodedData(){
for(Accomodation__c a : accod){
a.Location__Latitude__s = a.Location__Longitude__s = null;
}
Database.update(accod, false);
accod.clear();
}
public String getAccomodationJson(){
return JSON.serialize(accod);
}
public String getDebugAccomodationJson(){
return JSON.serializePretty(accod);
}
private void serverSideGeocode(){
List<Accomodation__c> accodToUpdate = new List<Accomodation__c>();
Http h = new Http();
HttpRequest req = new HttpRequest();
req.setMethod('GET');
req.setTimeout(10000);
for(Accomodation__c a : accod){
if((a.Location__Latitude__s == null || a.Location__Longitude__s == null)){
String address = a.Street_Address__c != null ? a.Street_Address__c + ' ' : '' +
a.City__c != null ? a.City__c + ' ' : '' +
a.State__c != null ? a.State__c + ' ' : '' +
a.PostalCode__c != null ? a.PostalCode__c + ' ' : '' +
a.Country__c != null ? a.Country__c : '';
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(), tourmapController1.GResponse.class);
if(gr.status == 'OK'){
LatLng ll = gr.results[0].geometry.location;
a.Location__Latitude__s = ll.lat;
a.Location__Longitude__s = ll.lng;
accodToUpdate.add(a);
} else {
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, 'Geocoding of "' + address + '" failed:' + gr.status));
}
}catch(Exception e){
ApexPages.addMessages(e);
}
}
if(Limits.getCallouts() == MAX_CALLOUTS_FROM_APEX) {
break;
}
}
}
if(!accodToUpdate.isEmpty()) {
Database.update(accodToUpdate, false); // some data in Developer editions is invalid (on purpose I think).
// If update fails because "j.davis@expressl&t.net" is not a valid Email, I want the rest to succeed
}
}
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;
}
}
I have a page and class.I have the field location of geolocation type.I want to show the location on GMAP when i search for a particular thing.Like when i select 'India', i am getting the records of having address in India But not getting their location on GMAP.
My code is:
Page:
<apex:page controller="tourmapController1" tabStyle="Accomodation__c" 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=true"></script>
</head>
<apex:sectionHeader title="Hello StackOverflow!" subtitle="Accomodation 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 {!accod.size} Accomodation__c..." rendered="{!NOT(ISNULL(accod)) && accod.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 accomodations" action="{!clearGeocodedData}" />
</apex:pageBlockButtons>
<apex:pageBlockTable value="{!accod}" var="a" id="accod">
<apex:column headerValue="{!$ObjectType.Accomodation__c.fields.Name.label}">
<apex:outputLink value="../{!a.Id}">{!a.Name}</apex:outputLink>
</apex:column>
<apex:column headerValue="Address">
{!a.Street_Address__c} {!a.City__c} {!a.Country__c}
</apex:column>
<apex:column value="{!a.Accomodation_Name__c}"/>
<apex:column headerValue="Location (retrieved from DB or geocoded server-side)">
{!a.Location__Latitude__s}, {!a.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>{!debugAccomodationJson}</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 accod = {!accodJson};
var coords = [];
var requestCounter = 0;
var markers = []; // Red things we pin to the map.
var balloon = new google.maps.InfoWindow();
function geocodeClientSide() {
for(var i = 0; i < accod.length; i++) {
if(accod[i].Location__Latitude__s != null && accod[i].Location__Longitude__s != null) {
coords.push(new google.maps.LatLng(accod[i].Location__Latitude__s, accod[i].Location__Longitude__s));
} else {
++requestCounter;
var address = accod[i].Street_Address__c + ' ' + accod[i].City__c + ' ' + accod[i].Country__c;
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();
}
});
}
}
}
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:accod[i].Name, zIndex:i});
google.maps.event.addListener(marker, 'click', function() {
var index = this.zIndex;
balloon.content = '<b>'+accod[index].Name + '</b><br/>' + accod[index].Accomodation_Name__c + '<br/>' + accod[index].City__c;
balloon.open(map,this);
});
markers.push(marker);
}
}
geocodeClientSide();
</script>
</apex:page>
Class:
public with sharing class tourmapController1 {
public String accodJson { get; set; }
public String searchText {get;set;}
public List<Accomodation__c> accod{get; private set;}
public static final String GEOCODING_URI_BASE = 'https://maps.googleapis.com/maps/api/geocode/json?sensor=true&address=';
public static final Integer MAX_CALLOUTS_FROM_APEX = 3; // Limits.getLimitCallouts()
public tourmapController1(){
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
Accomodation__c (Id, Name,Accomodation_Name__c,
Street_Address__c,City__c,PostalCode__c, State__c, Country__c,
Location__Latitude__s, Location__Longitude__s)
];
accod = (List<Accomodation__c>)results[0];
if(accod.isEmpty()){
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO, 'No matches for "' + searchText + '"'));
} else {
serverSideGeocode();
}
} else {
if(accod != null) {
accod.clear();
}
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO, 'Please provide at least 2 characters for the search.'));
}
}
public void clearGeocodedData(){
for(Accomodation__c a : accod){
a.Location__Latitude__s = a.Location__Longitude__s = null;
}
Database.update(accod, false);
accod.clear();
}
public String getAccomodationJson(){
return JSON.serialize(accod);
}
public String getDebugAccomodationJson(){
return JSON.serializePretty(accod);
}
private void serverSideGeocode(){
List<Accomodation__c> accodToUpdate = new List<Accomodation__c>();
Http h = new Http();
HttpRequest req = new HttpRequest();
req.setMethod('GET');
req.setTimeout(10000);
for(Accomodation__c a : accod){
if((a.Location__Latitude__s == null || a.Location__Longitude__s == null)){
String address = a.Street_Address__c != null ? a.Street_Address__c + ' ' : '' +
a.City__c != null ? a.City__c + ' ' : '' +
a.State__c != null ? a.State__c + ' ' : '' +
a.PostalCode__c != null ? a.PostalCode__c + ' ' : '' +
a.Country__c != null ? a.Country__c : '';
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(), tourmapController1.GResponse.class);
if(gr.status == 'OK'){
LatLng ll = gr.results[0].geometry.location;
a.Location__Latitude__s = ll.lat;
a.Location__Longitude__s = ll.lng;
accodToUpdate.add(a);
} else {
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, 'Geocoding of "' + address + '" failed:' + gr.status));
}
}catch(Exception e){
ApexPages.addMessages(e);
}
}
if(Limits.getCallouts() == MAX_CALLOUTS_FROM_APEX) {
break;
}
}
}
if(!accodToUpdate.isEmpty()) {
Database.update(accodToUpdate, false); // some data in Developer editions is invalid (on purpose I think).
// If update fails because "j.davis@expressl&t.net" is not a valid Email, I want the rest to succeed
}
}
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;
}
}
Please don't put code like this , this is not readable.
Post your code inside code section that is given in text editor with <> symbol .
Post ur question again in a proper way.
Thanks
Rishav