adith visnu
Posts: 0
Joined: Mon Jul 07, 2014 6:32 am

Create new infoWindow for multiple markers generated from REST.

here are the screenshot:
first, click these button on header
Image

then you'll see the markers

second, click this marker
Image

why infowindows appears on wrong markers? like this. info windows should appear on red circle markers
Image

here is my code
var ambilLokasi = localStorage.getItem('untukMarker');
var ubahJsonLokasi = JSON.parse(ambilLokasi);
var marker;

//alert(ambilLokasi);

var mapObject = Appery("gmap").options.mapElement.gmap('get', 'map');

var CreateMarker = function(ubahJsonLokasi, i) {
var infowindow = new google.maps.InfoWindow({
content: ubahJsonLokasi.deskripsi
});

Code: Select all

 marker = new google.maps.Marker({ 
     position: new google.maps.LatLng(ubahJsonLokasi[i].lat, ubahJsonLokasi[i].lng), 
     animation: google.maps.Animation.DROP, 
     map: mapObject 
 }); 
 markers.push(marker); 

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

};
for (var i = 0, j = ubahJsonLokasi.length; i < j; i++)
CreateMarker(ubahJsonLokasi, i);

Yurii Orishchuk
Posts: 0
Joined: Fri Feb 14, 2014 8:20 am

Create new infoWindow for multiple markers generated from REST.

Hi Adith,

Here is solution for you:

1 Open "startScreen" page.

2 Navigate to "data" page tab.

3 Delete your current "markers_map" datasource from this page at all.

4 Add one new "uCareMakassar_posting_list_service" service datasource with name "markers_map2"

5 Open "Events" bottom panel and add "success" event handler with following code: http://prntscr.com/4h4m26/direct

pre

var mapObject = Appery("gmap")&#46;options&#46;mapElement&#46;gmap('get', 'map');

var CreateMarker = function(ubahJsonLokasi, i) {
var infowindow = new google&#46;maps&#46;InfoWindow({
content: ubahJsonLokasi&#46;deskripsi
});

Code: Select all

 var marker = new google&#46;maps&#46;Marker({ 
     position: new google&#46;maps&#46;LatLng(ubahJsonLokasi[i]&#46;lat, ubahJsonLokasi[i]&#46;lng), 
     animation: google&#46;maps&#46;Animation&#46;DROP, 
     map: mapObject 
 }); 
 markers&#46;push(marker); 

 google&#46;maps&#46;event&#46;addListener(marker, 'click', function() { 
     infowindow&#46;open(mapObject, marker); 
     &#47;&#47;console&#46;log("click"); 
 }); 

};
for (var i = 0, j = data&#46;length; i < j; i++)
CreateMarker(data, i);

/pre

6 Invoke this service in case you need(for example on "top marker" click.

That's all.

Regards.

adith visnu
Posts: 0
Joined: Mon Jul 07, 2014 6:32 am

Create new infoWindow for multiple markers generated from REST.

http://prntscr.com/4h4m26/direct
hi yurii, that link above is blocked by my network. could you print screen the page on link above?

Yurii, your code work well. just like what i want.

i think this topic is done. thanks for your help Yurii.

Thanks Appery

Yurii Orishchuk
Posts: 0
Joined: Fri Feb 14, 2014 8:20 am

Create new infoWindow for multiple markers generated from REST.

Adith,

Thanks for you update.

In that link not anything special.

Regards.

Sylvia Lobo
Posts: 0
Joined: Tue Sep 30, 2014 2:26 pm

Create new infoWindow for multiple markers generated from REST.

Hi,
I am trying to show the Google Maps on click on an image in the html and on selecting marker the Location of the marker is posted back to the page. But when I click on the image only the popup is shown but google maps does not display. I would appreciate any help in this matter.
HTML:

Code: Select all

                 a class="location-icon openmap1" rel="nofollow" title="Location"/a 

js:

//for registration page

Code: Select all

 $(".openmap1").click(function (e) { 
     jQuery.noConflict(); 
     e.preventDefault(); 
     var mapContainer1 = $('#locationMap1'); 
     var locationInput1; 
     var latLng = new google.maps.LatLng(25.0623347, 55.2023577); 
     var gmarker1 ; 
     $('.overlayDiv:visible, .pp_div:visible').fadeOut(300); 
     $(".overlayDiv").css({ 'height': $(document).height() + 'px' }); 
     $('body  .overlayDiv').stop().fadeTo(300, 0.50, function () { 
         mapContainer1.fadeIn(300, function () { 

             locationInput1 = $('#location_input1').addresspicker({ 
                 regionBias: "uae", 
                 language: "en", 
                 reverseGeocode: true, 
                 mapOptions: { 
                     zoom: 14, 
                     center: latLng, 
                     mapTypeId: google.maps.MapTypeId.ROADMAP 
                 }, 
                 elements: { 
                     map: "#gmap1" 
                 } 
             }); 

             var gmarker1 = locationInput1.addresspicker( "marker"); 
             gmarker1.setVisible(true); 
             locationInput1.addresspicker( "updatePosition"); 
         }); 
     }); 
 }); 

jquery.ui.addresspicker.js

/*

  • jQuery UI addresspicker @VERSION
    *

  • Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)

  • Dual licensed under the MIT or GPL Version 2 licenses.

  • http://jquery.org/license
    *

  • Depends:

  • jquery.ui.core.js

  • jquery.ui.widget.js

  • jquery.ui.autocomplete.js
    */
    (function( $, undefined ) {

    $.widget( "ui.addresspicker", {
    options: {
    appendAddressString: "",
    draggableMarker: true,
    regionBias: null,
    componentsFilter:'',
    updateCallback: null,
    reverseGeocode: false,
    autocomplete: 'default',
    language: '',
    mapOptions: {
    zoom: 14,
    center: new google.maps.LatLng(25.0623347, 55.2023577),
    scrollwheel: true,
    mapTypeId: google.maps.MapTypeId.ROADMAP
    },
    elements: {
    map: false,
    lat: false,
    lng: false,
    street_number: false,
    route: false,
    locality: false,
    sublocality: false,
    administrative_area_level_2: false,
    administrative_area_level_1: false,
    country: false,
    postal_code: false,
    type: false

    Code: Select all

     }, 
     autocomplete: '' // could be autocomplete: "bootstrap" to use bootstrap typeahead autocomplete instead of jQueryUI 

},

Code: Select all

 marker: function() { 
   return this.gmarker; 
 }, 

 map: function() { 
   return this.gmap; 
 }, 

 updatePosition: function() { 
   this._updatePosition(this.gmarker.getPosition()); 
 }, 

 reloadPosition: function() { 
   this.gmarker.setVisible(true); 
   this.gmarker.setPosition(new google.maps.LatLng(this.lat.val, this.lng.val)); 
   this.gmap.setCenter(this.gmarker.getPosition()); 
 }, 

 selected: function() { 
   return this.selectedResult; 
 }, 
 _mapped: {}, 
 _create: function() { 
   var self = this; 
   this.geocoder = { 
     geocode: function(options, callback) 
     { 
       jQuery.ajax({ 
         url: "[url=https://maps.googleapis.com/maps/api/geocode/json]https://maps.googleapis.com/maps/api/...[/url]?" + jQuery.param(options) + '&sensor=false', 
         type: "GET", 
         success: function(data) { 
           callback(data.results, data.status); 
         } 
       }); 
     } 
     //new google.maps.Geocoder(); 
   }; 

   if (this.options.autocomplete === 'bootstrap') { 
       this.element.typeahead({ 
         source: function(query, process) { 
             self._mapped = {}; 
             var response = function(results) { 
                 var labels = []; 
                 for (var i = 0; i < results.length; i++) { 
                     self._mapped[results[i].label] = results[i]; 
                     labels.push(results[i].label); 
                 } 
                 process(labels); 
             }; 
             var request = {term: query}; 
             self._geocode(request, response); 
         }, 
         updater: function(item) { 
             var ui = {item: self._mapped[item]} 
             self._focusAddress(null, ui); 
             self._selectAddress(null, ui); 
             return item; 
         } 
       }); 
   } else { 
     this.element.autocomplete($.extend({ 
         source: $.proxy(this._geocode, this), 
         focus:  $.proxy(this._focusAddress, this), 
         select: $.proxy(this._selectAddress, this) 
     }), this.options.autocomplete); 
   } 

   this.lat      = $(this.options.elements.lat); 
   this.lng      = $(this.options.elements.lng); 
   this.street_number = $(this.options.elements.street_number); 
   this.route = $(this.options.elements.route); 
   this.locality = $(this.options.elements.locality); 
   this.sublocality = $(this.options.elements.sublocality); 
   this.administrative_area_level_2 = $(this.options.elements.administrative_area_level_2); 
   this.administrative_area_level_1 = $(this.options.elements.administrative_area_level_1); 
   this.country  = $(this.options.elements.country); 
   this.postal_code = $(this.options.elements.postal_code); 
   this.type     = $(this.options.elements.type); 
   if (this.options.elements.map) { 
     this.mapElement = $(this.options.elements.map); 
     this._initMap(); 
   } 
 }, 

 _initMap: function() { 
   if (this.lat && this.lat.val()) { 
     this.options.mapOptions.center = new google.maps.LatLng(this.lat.val(), this.lng.val()); 
   } 

   this.gmap = new google.maps.Map(this.mapElement[0], this.options.mapOptions); 
   this.gmarker = new google.maps.Marker({ 
     position: this.options.mapOptions.center, 
     map:this.gmap, 
     draggable: this.options.draggableMarker}); 
   google.maps.event.addListener(this.gmarker, 'dragend', $.proxy(this._markerMoved, this)); 
   this.gmarker.setVisible(false); 
 }, 

 _updatePosition: function(location) { 
   if (this.lat) { 
     this.lat.val(location.lat()); 
   } 
   if (this.lng) { 
     this.lng.val(location.lng()); 
   } 
 }, 

 _addressParts: {street_number: null, route: null, locality: null, sublocality: null, 
                 administrative_area_level_2: null, administrative_area_level_1: null, 
                 country: null, postal_code:null, type: null}, 

 _updateAddressParts: function(geocodeResult){ 

   parsedResult = this._parseGeocodeResult(geocodeResult); 

   for (addressPart in this._addressParts){ 
     if (this[addressPart]){ 
       if (parsedResult[addressPart] !== false){ 
         this[addressPart].val(parsedResult[addressPart]); 
       } else { 
         this[addressPart].val(''); 
       } 
     } 
   } 
 }, 

 _updateAddressPartsViaReverseGeocode: function(location){ 
   this.geocoder.geocode({'latlng': location.lat() + "," + location.lng()}, $.proxy(function(results, status){ 
     if (status == google.maps.GeocoderStatus.OK){ 

       this._updateAddressParts(results[0]); 
       this.element.val(results[0].formatted_address); 
       this.selectedResult = results[0]; 

       if (this.options.updateCallback) { 
         this.options.updateCallback(this.selectedResult, this._parseGeocodeResult(this.selectedResult)); 
       } 
     } 
   }, this)); 
 }, 

 _parseGeocodeResult: function(geocodeResult){ 

   var parsed = {lat: geocodeResult.geometry.location.lat, 
     lng: geocodeResult.geometry.location.lng}; 

   for (var addressPart in this._addressParts){ 
     parsed[addressPart] = this._findInfo(geocodeResult, addressPart); 
   } 

   parsed.type = geocodeResult.types[0]; 

   return parsed; 
 }, 

 _markerMoved: function() { 
   this._updatePosition(this.gmarker.getPosition()); 

   if (this.options.reverseGeocode){ 
     this._updateAddressPartsViaReverseGeocode(this.gmarker.getPosition()); 
   } 
 }, 

 // Autocomplete source method: fill its suggests with google geocoder results 
 _geocode: function(request, response) { 
     var address = request.term, self = this; 
     this.geocoder.geocode({ 
       'language': this.options.language, 
       'address': address + this.options.appendAddressString, 
       'region': this.options.regionBias, 
       'components': this.options.componentsFilter 
     }, function(results, status) { 
         if (status == google.maps.GeocoderStatus.OK && results) { 
             for (var i = 0; i < results.length; i++) { 
               result = results[i] 
               g = result.geometry 
               g.location = new google.maps.LatLng(g.location.lat, g.location.lng); 
               g.viewport = new google.maps.LatLngBounds( 
                 new google.maps.LatLng(g.viewport.southwest.lat, g.viewport.southwest.lng), 
                 new google.maps.LatLng(g.viewport.northeast.lat, g.viewport.northeast.lng) 
               ) 
               result.label =  results[i].formatted_address; 
             } 
         } 
         response(results); 
     }) 
 }, 

 _findInfo: function(result, type) { 
   for (var i = 0; i < result.address_components.length; i++) { 
     var component = result.address_components[i]; 
     if (component.types.indexOf(type) !=-1) { 
       return component.long_name; 
     } 
   } 
   return false; 
 }, 

 _focusAddress: function(event, ui) { 
   var address = ui.item; 
   if (!address) { 
     return; 
   } 
   if (this.gmarker) { 
     this.gmarker.setPosition(address.geometry.location); 
     this.gmarker.setVisible(true); 
     this.gmap.fitBounds(address.geometry.viewport); 
   } 

   this._updatePosition(address.geometry.location); 

   this._updateAddressParts(address); 

 }, 

 _selectAddress: function(event, ui) { 
   this.selectedResult = ui.item; 
   if (this.options.updateCallback) { 
     this.options.updateCallback(this.selectedResult, this._parseGeocodeResult(this.selectedResult)); 
   } 
 } 

});

$.extend( $.ui.addresspicker, {
version: "@VERSION"
});

// make IE think it doesn't suck
if(!Array.indexOf){
Array.prototype.indexOf = function(obj){
for(var i=0; i<this.length; i++){
if(this==obj){
return i;
}
}
return -1;
}
}

})( jQuery );

Yurii Orishchuk
Posts: 0
Joined: Fri Feb 14, 2014 8:20 am

Create new infoWindow for multiple markers generated from REST.

Hi Sylvia,

It's lot of custom logic.
You need to debug it with following instructions: http://devcenter.appery.io/documentat...

Here is how you can do it with Appery.io way:
1 Create popup and insert inside this popup map component.
2 On image component click - open popup and set map/markers in accordance to your needs.
3 On marker click - set some LSV data and close popup.

Regards.

gregt
Posts: 0
Joined: Mon Jan 12, 2015 11:04 am

Create new infoWindow for multiple markers generated from REST.

hi there matt.
what about if i want to use a buuton to clear the markers?

gregt
Posts: 0
Joined: Mon Jan 12, 2015 11:04 am

Create new infoWindow for multiple markers generated from REST.

hi there
matt how did you manage to use the above code with the radius function?
i can get the location lat lon and rad from the app, i added the getDistance function , but i can not get the markers
code

&#47;&#47; Get request parameters
var mylatitude = Appery('label_lat')&#46;text();
var mylongitude = Appery('label_lon')&#46;text();
var myradius = Appery('radiusv')&#46;val();
&#47;&#47; The function that calculates the distance between two points

function getDistance(lat1, lat2, lon1, lon2) {
var R = 6371; &#47;&#47; Earth radius in km
var dLat = (lat2 - lat1)Math&#46;PI/180;
var dLon = (lon2 - lon1)Math&#46;PI/180;
var lat1 = lat1Math&#46;PI/180;
var lat2 = lat2Math&#46;PI/180;
var a = Math&#46;sin(dLat / 2) * Math&#46;sin(dLat / 2) + Math&#46;sin(dLon / 2) * Math&#46;sin(dLon / 2) * Math&#46;cos(lat1) * Math&#46;cos(lat2);
var c = 2 * Math&#46;atan2(Math&#46;sqrt(a), Math&#46;sqrt(1 - a));
var d = R * c;
return d;
}

/code
.....
code
for (var i = 0, j = coordsArray&#46;length; i < j; i++){
if (getDistance(coordsArray&#46;latitude, mylatitude, coordsArray&#46;longitude, mylongitude) <= myradius) {
CreateMarker(coordsArray, i);
}

}
/code
any ideas ?
thnx in advance
greg

gregt
Posts: 0
Joined: Mon Jan 12, 2015 11:04 am

Create new infoWindow for multiple markers generated from REST.

hi there
following the steps above i manage to do the following.
get and list the markers from my database using columns lat and lon by pressing a button list that invokeServiceOnMapReady . also add a radius function that give me the markers with in the radius. and finaly i have a clear button that clears all the markers.
my problem is that when i change the radius in order to take more or less markers i have to click on clear markers and then click list button to list again.
any hints of hot i can just click the list button and clear the markers and then list the new ones without clicking on the clear button?
code
var response = JSON&#46;stringify(data);
localStorage&#46;setItem("json_response", response);
var list_coordinate = localStorage&#46;getItem('json_response');
var coordsArray = JSON&#46;parse(list_coordinate);
var marker;
var markersArray=[];
var ClearM = Appery('clear');

var mylatitude = Appery('label_lat')&#46;text();
var mylongitude = Appery('label_lon')&#46;text();
var myradius = Appery('radiusv')&#46;val();

/*map custom icons */

var customIcons = {
farm: {
ico&#46;&#46;&#46;&#46;&#46;&#46;&#46;

};

var mapOptions = {
&#47;&#47;zoom: 5,
&#47;&#47;center: myLatlng,
&#47;&#47;&#46;&#46;&#46;
}
};

var CreateMarker = function(coordsArray,i){
&#47;&#47; function CreateMarker(coordsArray,i) {
var mtyper= coordsArray&#46;type;
var icon = customIcons[mtyper] || {};
var marker = new google&#46;maps&#46;Marker({
position: new google&#46;maps&#46;LatLng( coordsArray&#46;latitude, coordsArray&#46;longitude ),
title: coordsArray&#46;company_name,
icon:icon&#46;icon ,
map: Appery("googlemap1")&#46;gmap
});
markersArray&#46;push(marker);
var mtype = coordsArray&#46;type;
var company_logo = coordsArray&#46;company_logo;
var company_name = coordsArray&#46;company_name;
var Contact_Name = coordsArray&#46;Contact_Name;
&#46;&#46;&#46;&#46;&#46;&#46;&#46;&#46;&#46;
+' <>'

Code: Select all

  +' <div>';     

var infowindow = new google&#46;maps&#46;InfoWindow( { 
    content: bubbleCont});  

 google&#46;maps&#46;event&#46;addListener(marker, 'click', function() {  
      infowindow&#46;open(Appery("googlemap1")&#46;gmap,marker);  
 });  

};

function getDistance(lat1, lat2, lon1, lon2) {
var R = 6371; &#47;&#47; Earth radius in km
var dLat = (lat2 - lat1)Math&#46;PI/180;
var dLon = (lon2 - lon1)Math&#46;PI/180;
var lat1 = lat1Math&#46;PI/180;
var lat2 = lat2Math&#46;PI/180;
var a = Math&#46;sin(dLat / 2) * Math&#46;sin(dLat / 2) + Math&#46;sin(dLon / 2) * Math&#46;sin(dLon / 2) * Math&#46;cos(lat1) * Math&#46;cos(lat2);
var c = 2 * Math&#46;atan2(Math&#46;sqrt(a), Math&#46;sqrt(1 - a));
var d = R * c;
return d;
}

function deleteMarkers() {
for (i = 0; i < markersArray&#46;length; i++) {
markersArray&#46;setMap(null);
markersArray&#46;setVisible(false);
}
console&#46;log('deleteMarkers has run');
&#47;&#47;Appery("map")&#46;options&#46;mapElement&#46;gmap("refresh");
&#47;&#47;markersArray&#46;length =0;
}
$(ClearM)&#46;bind("click", deleteMarkers);

for (var i = 0, j = coordsArray&#46;length; i < j; i++){
if (getDistance(coordsArray&#46;latitude, mylatitude, coordsArray&#46;longitude, mylongitude) <= myradius) {
CreateMarker(coordsArray,i);
}
}

Appery("googlemap1")&#46;options&#46;mapElement&#46;gmap(mapOptions);
Appery("googlemap1")&#46;options&#46;mapElement&#46;gmap("refresh");
/code

Alena Prykhodko
Posts: 0
Joined: Tue Apr 09, 2013 7:36 am

Create new infoWindow for multiple markers generated from REST.

Hi,

1) Write a function in one of your js files that sets all map markers to null
2) In the same function create new markers and apply them to new map

Return to “Issues”