Our goal is to display website visitors on a map, similar to the image below.
We will convert their IP addresses into latitude/longitude coordinates and display the markers on the OpenStreetMap map. To convert IP addresses into lat/lng pairs we will use geolocation data from ip2location.com.
We will show users who were active in the last ten minutes. If the user performed activity in the last 60 seconds, the dot will flash.
There is also a YouTube video that provides more details about the project.
1. Database structure.
We will need two tables, ‘users’ and ‘ip2 location’. The following is the MySQL database script.
Please note that this SQL script only creates ‘ip2location’ but not the data. The dataset itself is around 300Mb in size and you can download it for free at
2. Insert the code snippet into the page where you want to display the map. In our case, this is a menu page. The code itself is very simple, just displays a div with the ID ‘map’.
PHP Code:
3. AfterApplicationInitialized event
PHP Code:
4. custom_function.js
The following Javascript code goes into the Event Editor -> custom_function.js section.
$(document).ready(function() {
$("#map").width($(".r-fluid").width());
var height = $(window).height() - $("#map").offset().top - 30;
$("#map").height(height);
window.mapObj = new OpenLayers.Map("map", {
controls: [
new OpenLayers.Control.PanZoomBar(),
new OpenLayers.Control.Navigation()
],
});
var layer = new OpenLayers.Layer.OSM();
mapObj.addLayer(layer);
window.markersList = new OpenLayers.Layer.Markers("Markers");
mapObj.addLayer(markersList);
mapObj.zoomToMaxExtent();
updateMarkers();
setInterval(updateMarkers, 5000);
function updateMarkers() {
$.post("", {
getActiveUsers: true
}, function(response) {
var coordsArr = JSON.parse(response),
activeIds = coordsArr.map(function(coords) {
return coords.id;
}),
allIds = markersList.markers.map(function(marker) {
return marker.id;
});
$.each(coordsArr, function(i, latLon) {
if (!allIds.includes(latLon.id)) {
addMarker(latLon.id, latLon.lat, latLon.lng, latLon.active);
} else {
var curMarker = markersList.markers.find(function(marker) {
return marker.id == latLon.id
});
if (curMarker.active != latLon.active) {
$(curMarker.icon.imageDiv).toggleClass("active", latLon.active);
}
}
});
allIds = markersList.markers.map(function(marker) {
return marker.id;
});
for (var i = 0; i < allIds.length; i++) {
if (allIds[i] != undefined && !activeIds.includes(allIds[i])) {
var markerToRemove = markersList.markers.find(function(marker) {
return marker.id == allIds[i]
});
markersList.removeMarker(markerToRemove);
}
}
function addMarker(id, lat, lng, active) {
var lonLat = new OpenLayers.LonLat(lng, lat)
.transform(
new OpenLayers.Projection("EPSG:4326"), // transform from WGS 1984
mapObj.getProjectionObject() // to Spherical Mercator Projection
);
var icon = new OpenLayers.Icon("", new OpenLayers.Size(15, 15));
var marker = new OpenLayers.Marker(lonLat, icon);
if (active) {
$(marker.icon.imageDiv).addClass("active");
}
marker.id = id;
marker.active = active;
markersList.addMarker(marker);
return marker;
}
});
}
updateMarkers();
});
5. CSS Code (Style Editor -> Change CSS)
We use this CSS code to customize and beautify the default appearance of OSM maps.
Teknologi Terkini
Agen Togel Terpercaya
Bandar Togel
Sabung Ayam Online
Berita Terkini
Artikel Terbaru
Berita Terbaru
Penerbangan
Berita Politik
Berita Politik
Software
Software Download
Download Aplikasi
Berita Terkini
News
Jasa PBN
Jasa Artikel
News
Breaking News
Berita