ภาพรวม
บทแนะนำนี้จะแสดงวิธีสร้างแผนที่แบบอินเทอร์แอกทีฟโดยใช้แพลตฟอร์มแอปพลิเคชัน Firebase ลองคลิกสถานที่ต่างๆ ในแผนที่ด้านล่างเพื่อสร้างแผนที่ความร้อน
ส่วนด้านล่างแสดงโค้ดทั้งหมดที่จําเป็นในการสร้างแผนที่ในบทแนะนํานี้
/** * Firebase config block. */ var config = { apiKey: 'AIzaSyDX-tgWqPmTme8lqlFn2hIsqwxGL6FYPBY', authDomain: 'maps-docs-team.firebaseapp.com', databaseURL: 'https://maps-docs-team.firebaseio.com', projectId: 'maps-docs-team', storageBucket: 'maps-docs-team.appspot.com', messagingSenderId: '285779793579' }; firebase.initializeApp(config); /** * Data object to be written to Firebase. */ var data = {sender: null, timestamp: null, lat: null, lng: null}; function makeInfoBox(controlDiv, map) { // Set CSS for the control border. var controlUI = document.createElement('div'); controlUI.style.boxShadow = 'rgba(0, 0, 0, 0.298039) 0px 1px 4px -1px'; controlUI.style.backgroundColor = '#fff'; controlUI.style.border = '2px solid #fff'; controlUI.style.borderRadius = '2px'; controlUI.style.marginBottom = '22px'; controlUI.style.marginTop = '10px'; controlUI.style.textAlign = 'center'; controlDiv.appendChild(controlUI); // Set CSS for the control interior. var controlText = document.createElement('div'); controlText.style.color = 'rgb(25,25,25)'; controlText.style.fontFamily = 'Roboto,Arial,sans-serif'; controlText.style.fontSize = '100%'; controlText.style.padding = '6px'; controlText.textContent = 'The map shows all clicks made in the last 10 minutes.'; controlUI.appendChild(controlText); } /** * Starting point for running the program. Authenticates the user. * @param {function()} onAuthSuccess - Called when authentication succeeds. */ function initAuthentication(onAuthSuccess) { firebase.auth().signInAnonymously().catch(function(error) { console.log(error.code + ', ' + error.message); }, {remember: 'sessionOnly'}); firebase.auth().onAuthStateChanged(function(user) { if (user) { data.sender = user.uid; onAuthSuccess(); } else { // User is signed out. } }); } /** * Creates a map object with a click listener and a heatmap. */ function initMap() { var map = new google.maps.Map(document.getElementById('map'), { center: {lat: 0, lng: 0}, zoom: 3, styles: [{ featureType: 'poi', stylers: [{ visibility: 'off' }] // Turn off POI. }, { featureType: 'transit.station', stylers: [{ visibility: 'off' }] // Turn off bus, train stations etc. }], disableDoubleClickZoom: true, streetViewControl: false, }); // Create the DIV to hold the control and call the makeInfoBox() constructor // passing in this DIV. var infoBoxDiv = document.createElement('div'); makeInfoBox(infoBoxDiv, map); map.controls[google.maps.ControlPosition.TOP_CENTER].push(infoBoxDiv); // Listen for clicks and add the location of the click to firebase. map.addListener('click', function(e) { data.lat = e.latLng.lat(); data.lng = e.latLng.lng(); addToFirebase(data); }); // Create a heatmap. var heatmap = new google.maps.visualization.HeatmapLayer({ data: [], map: map, radius: 16 }); initAuthentication(initFirebase.bind(undefined, heatmap)); } /** * Set up a Firebase with deletion on clicks older than expiryMs * @param {!google.maps.visualization.HeatmapLayer} heatmap The heatmap to */ function initFirebase(heatmap) { // 10 minutes before current time. var startTime = new Date().getTime() - (60 * 10 * 1000); // Reference to the clicks in Firebase. var clicks = firebase.database().ref('clicks'); // Listen for clicks and add them to the heatmap. clicks.orderByChild('timestamp').startAt(startTime).on('child_added', function(snapshot) { // Get that click from firebase. var newPosition = snapshot.val(); var point = new google.maps.LatLng(newPosition.lat, newPosition.lng); var elapsedMs = Date.now() - newPosition.timestamp; // Add the point to the heatmap. heatmap.getData().push(point); // Request entries older than expiry time (10 minutes). var expiryMs = Math.max(60 * 10 * 1000 - elapsedMs, 0); // Set client timeout to remove the point after a certain time. window.setTimeout(function() { // Delete the old point from the database. snapshot.ref.remove(); }, expiryMs); } ); // Remove old data from the heatmap when a point is removed from firebase. clicks.on('child_removed', function(snapshot, prevChildKey) { var heatmapData = heatmap.getData(); var i = 0; while (snapshot.val().lat != heatmapData.getAt(i).lat() || snapshot.val().lng != heatmapData.getAt(i).lng()) { i++; } heatmapData.removeAt(i); }); } /** * Updates the last_message/ path with the current timestamp. * @param {function(Date)} addClick After the last message timestamp has been updated, * this function is called with the current timestamp to add the * click to the firebase. */ function getTimestamp(addClick) { // Reference to location for saving the last click time. var ref = firebase.database().ref('last_message/' + data.sender); ref.onDisconnect().remove(); // Delete reference from firebase on disconnect. // Set value to timestamp. ref.set(firebase.database.ServerValue.TIMESTAMP, function(err) { if (err) { // Write to last message was unsuccessful. console.log(err); } else { // Write to last message was successful. ref.once('value', function(snap) { addClick(snap.val()); // Add click with same timestamp. }, function(err) { console.warn(err); }); } }); } /** * Adds a click to firebase. * @param {Object} data The data to be added to firebase. * It contains the lat, lng, sender and timestamp. */ function addToFirebase(data) { getTimestamp(function(timestamp) { // Add the new timestamp to the record data. data.timestamp = timestamp; var ref = firebase.database().ref('clicks').push(data, function(err) { if (err) { // Data was not written to firebase. console.warn(err); } }); }); }
<div id="map"></div>
/* Always set the map height explicitly to define the size of the div * element that contains the map. */ #map { height: 100%; } /* Optional: Makes the sample page fill the window. */ html, body { height: 100%; margin: 0; padding: 0; }
<!-- Replace the value of the key parameter with your own API key. --> <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk&libraries=visualization&callback=initMap" defer></script> <script src="https://www.gstatic.com/firebasejs/5.3.0/firebase.js"></script>
ลองใช้ดู
คุณสามารถทดสอบโค้ดนี้ใน JSFiddle ได้โดยคลิกไอคอน <>
ที่มุมขวาบนของหน้าต่างโค้ด
<!DOCTYPE html>
<html>
<head>
<style>
/* Always set the map height explicitly to define the size of the div
* element that contains the map. */
#map {
height: 100%;
}
/* Optional: Makes the sample page fill the window. */
html, body {
height: 100%;
margin: 0;
padding: 0;
}
</style>
</head>
<body>
<div id="map"></div>
<script src="https://www.gstatic.com/firebasejs/5.3.0/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/5.3.0/firebase-auth.js"></script>
<script src="https://www.gstatic.com/firebasejs/5.3.0/firebase-database.js"></script>
<script>
/**
* Firebase config block.
*/
var config = {
apiKey: 'AIzaSyDX-tgWqPmTme8lqlFn2hIsqwxGL6FYPBY',
authDomain: 'maps-docs-team.firebaseapp.com',
databaseURL: 'https://maps-docs-team.firebaseio.com',
projectId: 'maps-docs-team',
storageBucket: 'maps-docs-team.appspot.com',
messagingSenderId: '285779793579'
};
firebase.initializeApp(config);
/**
* Data object to be written to Firebase.
*/
var data = {sender: null, timestamp: null, lat: null, lng: null};
function makeInfoBox(controlDiv, map) {
// Set CSS for the control border.
var controlUI = document.createElement('div');
controlUI.style.boxShadow = 'rgba(0, 0, 0, 0.298039) 0px 1px 4px -1px';
controlUI.style.backgroundColor = '#fff';
controlUI.style.border = '2px solid #fff';
controlUI.style.borderRadius = '2px';
controlUI.style.marginBottom = '22px';
controlUI.style.marginTop = '10px';
controlUI.style.textAlign = 'center';
controlDiv.appendChild(controlUI);
// Set CSS for the control interior.
var controlText = document.createElement('div');
controlText.style.color = 'rgb(25,25,25)';
controlText.style.fontFamily = 'Roboto,Arial,sans-serif';
controlText.style.fontSize = '100%';
controlText.style.padding = '6px';
controlText.textContent =
'The map shows all clicks made in the last 10 minutes.';
controlUI.appendChild(controlText);
}
/**
* Starting point for running the program. Authenticates the user.
* @param {function()} onAuthSuccess - Called when authentication succeeds.
*/
function initAuthentication(onAuthSuccess) {
firebase.auth().signInAnonymously().catch(function(error) {
console.log(error.code + ', ' + error.message);
}, {remember: 'sessionOnly'});
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
data.sender = user.uid;
onAuthSuccess();
} else {
// User is signed out.
}
});
}
/**
* Creates a map object with a click listener and a heatmap.
*/
function initMap() {
var map = new google.maps.Map(document.getElementById('map'), {
center: {lat: 0, lng: 0},
zoom: 3,
styles: [{
featureType: 'poi',
stylers: [{ visibility: 'off' }] // Turn off POI.
},
{
featureType: 'transit.station',
stylers: [{ visibility: 'off' }] // Turn off bus, train stations etc.
}],
disableDoubleClickZoom: true,
streetViewControl: false,
});
// Create the DIV to hold the control and call the makeInfoBox() constructor
// passing in this DIV.
var infoBoxDiv = document.createElement('div');
makeInfoBox(infoBoxDiv, map);
map.controls[google.maps.ControlPosition.TOP_CENTER].push(infoBoxDiv);
// Listen for clicks and add the location of the click to firebase.
map.addListener('click', function(e) {
data.lat = e.latLng.lat();
data.lng = e.latLng.lng();
addToFirebase(data);
});
// Create a heatmap.
var heatmap = new google.maps.visualization.HeatmapLayer({
data: [],
map: map,
radius: 16
});
initAuthentication(initFirebase.bind(undefined, heatmap));
}
/**
* Set up a Firebase with deletion on clicks older than expiryMs
* @param {!google.maps.visualization.HeatmapLayer} heatmap The heatmap to
*/
function initFirebase(heatmap) {
// 10 minutes before current time.
var startTime = new Date().getTime() - (60 * 10 * 1000);
// Reference to the clicks in Firebase.
var clicks = firebase.database().ref('clicks');
// Listen for clicks and add them to the heatmap.
clicks.orderByChild('timestamp').startAt(startTime).on('child_added',
function(snapshot) {
// Get that click from firebase.
var newPosition = snapshot.val();
var point = new google.maps.LatLng(newPosition.lat, newPosition.lng);
var elapsedMs = Date.now() - newPosition.timestamp;
// Add the point to the heatmap.
heatmap.getData().push(point);
// Request entries older than expiry time (10 minutes).
var expiryMs = Math.max(60 * 10 * 1000 - elapsedMs, 0);
// Set client timeout to remove the point after a certain time.
window.setTimeout(function() {
// Delete the old point from the database.
snapshot.ref.remove();
}, expiryMs);
}
);
// Remove old data from the heatmap when a point is removed from firebase.
clicks.on('child_removed', function(snapshot, prevChildKey) {
var heatmapData = heatmap.getData();
var i = 0;
while (snapshot.val().lat != heatmapData.getAt(i).lat()
|| snapshot.val().lng != heatmapData.getAt(i).lng()) {
i++;
}
heatmapData.removeAt(i);
});
}
/**
* Updates the last_message/ path with the current timestamp.
* @param {function(Date)} addClick After the last message timestamp has been updated,
* this function is called with the current timestamp to add the
* click to the firebase.
*/
function getTimestamp(addClick) {
// Reference to location for saving the last click time.
var ref = firebase.database().ref('last_message/' + data.sender);
ref.onDisconnect().remove(); // Delete reference from firebase on disconnect.
// Set value to timestamp.
ref.set(firebase.database.ServerValue.TIMESTAMP, function(err) {
if (err) { // Write to last message was unsuccessful.
console.log(err);
} else { // Write to last message was successful.
ref.once('value', function(snap) {
addClick(snap.val()); // Add click with same timestamp.
}, function(err) {
console.warn(err);
});
}
});
}
/**
* Adds a click to firebase.
* @param {Object} data The data to be added to firebase.
* It contains the lat, lng, sender and timestamp.
*/
function addToFirebase(data) {
getTimestamp(function(timestamp) {
// Add the new timestamp to the record data.
data.timestamp = timestamp;
var ref = firebase.database().ref('clicks').push(data, function(err) {
if (err) { // Data was not written to firebase.
console.warn(err);
}
});
});
}
</script>
<script defer
src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=visualization&callback=initMap">
</script>
</body>
</html>
เริ่มต้นใช้งาน
คุณพัฒนาแผนที่ Firebase เวอร์ชันของคุณเองได้โดยใช้โค้ดในบทแนะนํานี้ หากต้องการเริ่มดำเนินการนี้ ให้สร้างไฟล์ใหม่ในเครื่องมือแก้ไขข้อความและบันทึกเป็น index.html
อ่านส่วนต่อไปนี้เพื่อทำความเข้าใจโค้ดที่เพิ่มลงในไฟล์นี้ได้
การสร้างแผนที่พื้นฐาน
ส่วนนี้อธิบายโค้ดที่ใช้ตั้งค่าแผนที่พื้นฐาน ซึ่งอาจคล้ายกับวิธีสร้างแผนที่เมื่อเริ่มต้นใช้งาน Maps JavaScript API
คัดลอกโค้ดด้านล่างลงในไฟล์ index.html
โค้ดนี้จะโหลด Maps JavaScript API และทำให้แผนที่แสดงแบบเต็มหน้าจอ รวมถึงโหลดคลังการแสดงภาพ ซึ่งคุณจะต้องใช้ในบทแนะนําการสร้างแผนที่ความร้อนในภายหลัง
<!DOCTYPE html>
<html>
<head>
<style>
#map {
height: 100%;
}
html, body {
height: 100%;
margin: 0;
padding: 0;
}
</style>
</head>
<body>
<div id="map"></div>
<script defer
src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY
&libraries=visualization&callback=initMap">
</script>
<script>
// The JavaScript code that creates the Firebase map goes here.
</script>
</body>
</html>
คลิก YOUR_API_KEY
ในตัวอย่างโค้ด หรือทําตามวิธีการเพื่อรับคีย์ API แทนที่ YOUR_API_KEY
ด้วยคีย์ API ของแอปพลิเคชัน
ส่วนต่อไปนี้จะอธิบายโค้ด JavaScript ที่สร้างแผนที่ Firebase คุณสามารถคัดลอกและบันทึกโค้ดในไฟล์ firebasemap.js
และอ้างอิงโค้ดระหว่างแท็กสคริปต์ได้ดังตัวอย่างด้านล่าง
<script>firebasemap.js</script>
หรือจะแทรกโค้ดภายในแท็กสคริปต์โดยตรงก็ได้ เช่น ในโค้ดตัวอย่างแบบเต็มตอนต้นของบทแนะนำนี้
เพิ่มโค้ดด้านล่างลงในไฟล์ firebasemap.js
หรือระหว่างแท็กสคริปต์ว่างของไฟล์ index.html
นี่คือจุดเริ่มต้นที่เรียกใช้โปรแกรมโดยการสร้างฟังก์ชันที่จะเริ่มต้นวัตถุแผนที่
function initMap() { var map = new google.maps.Map(document.getElementById('map'), { center: {lat: 0, lng: 0}, zoom: 3, styles: [{ featureType: 'poi', stylers: [{ visibility: 'off' }] // Turn off points of interest. }, { featureType: 'transit.station', stylers: [{ visibility: 'off' }] // Turn off bus stations, train stations, etc. }], disableDoubleClickZoom: true, streetViewControl: false }); }
โค้ดด้านบนใช้การจัดสไตล์แผนที่เพื่อปิดใช้จุดที่น่าสนใจและสถานีขนส่งสาธารณะ (ซึ่งจะแสดงหน้าต่างข้อมูลเมื่อคลิก) เพื่อให้ใช้แผนที่ความร้อนแบบคลิกได้สะดวกขึ้น นอกจากนี้ ยังปิดใช้การซูมเมื่อดับเบิลคลิกเพื่อป้องกันการซูมโดยไม่ตั้งใจด้วย อ่านเพิ่มเติมเกี่ยวกับการจัดรูปแบบแผนที่
หลังจากโหลด API จนเสร็จสมบูรณ์แล้ว พารามิเตอร์ Callback ในแท็กสคริปต์ด้านล่างจะเรียกใช้ฟังก์ชัน initMap()
ในไฟล์ HTML
<script defer
src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY
&libraries=visualization&callback=initMap">
</script>
เพิ่มโค้ดด้านล่างเพื่อสร้างการควบคุมข้อความที่ด้านบนของแผนที่
function makeInfoBox(controlDiv, map) { // Set CSS for the control border. var controlUI = document.createElement('div'); controlUI.style.boxShadow = 'rgba(0, 0, 0, 0.298039) 0px 1px 4px -1px'; controlUI.style.backgroundColor = '#fff'; controlUI.style.border = '2px solid #fff'; controlUI.style.borderRadius = '2px'; controlUI.style.marginBottom = '22px'; controlUI.style.marginTop = '10px'; controlUI.style.textAlign = 'center'; controlDiv.appendChild(controlUI); // Set CSS for the control interior. var controlText = document.createElement('div'); controlText.style.color = 'rgb(25,25,25)'; controlText.style.fontFamily = 'Roboto,Arial,sans-serif'; controlText.style.fontSize = '100%'; controlText.style.padding = '6px'; controlText.innerText = 'The map shows all clicks made in the last 10 minutes.'; controlUI.appendChild(controlText); }
เพิ่มโค้ดด้านล่างภายในฟังก์ชัน initMap
หลัง var map
เพื่อโหลดกล่องควบคุมข้อความ
// Create the DIV to hold the control and call the makeInfoBox() constructor // passing in this DIV. var infoBoxDiv = document.createElement('div'); var infoBox = new makeInfoBox(infoBoxDiv, map); infoBoxDiv.index = 1; map.controls[google.maps.ControlPosition.TOP_CENTER].push(infoBoxDiv);
หากต้องการดูแผนที่ Google ที่โค้ดสร้างขึ้น ให้เปิดไฟล์ index.html
ในเว็บเบราว์เซอร์
การตั้งค่า Firebase
หากต้องการให้แอปพลิเคชันนี้ทำงานร่วมกันได้ คุณต้องจัดเก็บการคลิกในฐานข้อมูลภายนอกที่ผู้ใช้ทุกคนเข้าถึงได้ ฐานข้อมูลเรียลไทม์ของ Firebase เหมาะสําหรับวัตถุประสงค์นี้ และไม่จำเป็นต้องมีความรู้เกี่ยวกับ SQL
ก่อนอื่น ให้ลงชื่อสมัครใช้บัญชี Firebase โดยไม่มีค่าใช้จ่าย
หากคุณเพิ่งเริ่มใช้ Firebase คุณจะเห็นแอปใหม่ชื่อ "แอปแรกของฉัน" หากสร้างแอปใหม่ คุณจะตั้งชื่อใหม่และกำหนด URL Firebase ที่กำหนดเองซึ่งลงท้ายด้วย firebaseIO.com
ได้ เช่น คุณอาจตั้งชื่อแอปเป็น "แผนที่ Firebase ของ Jane" ที่มี URL https://janes-firebase-map.firebaseIO.com
คุณสามารถใช้ URL นี้เพื่อลิงก์ฐานข้อมูลกับแอปพลิเคชัน JavaScript
เพิ่มบรรทัดด้านล่างหลังแท็ก <head>
ของไฟล์ HTML เพื่อนําเข้าไลบรารี Firebase
<script src="www.gstatic.com/firebasejs/5.3.0/firebase.js"></script>
เพิ่มบรรทัดต่อไปนี้ลงในไฟล์ JavaScript
var firebase = new Firebase("<Your Firebase URL here>");
การจัดเก็บข้อมูลคลิกใน Firebase
ส่วนนี้จะอธิบายโค้ดที่จัดเก็บข้อมูลใน Firebase เกี่ยวกับการคลิกเมาส์บนแผนที่
สําหรับการคลิกเมาส์แต่ละครั้งบนแผนที่ โค้ดด้านล่างจะสร้างออบเจ็กต์ข้อมูลส่วนกลางและจัดเก็บข้อมูลไว้ใน Firebase ออบเจ็กต์นี้จะบันทึกข้อมูล เช่น latLng และการประทับเวลาของการคลิก รวมถึงรหัสที่ไม่ซ้ำของเบราว์เซอร์ที่สร้างการคลิก
/** * Data object to be written to Firebase. */ var data = { sender: null, timestamp: null, lat: null, lng: null };
โค้ดด้านล่างจะบันทึกรหัสเซสชันที่ไม่ซ้ำกันกับการคลิกแต่ละครั้ง ซึ่งช่วยควบคุมอัตราการเข้าชมแผนที่ให้เป็นไปตามกฎด้านความปลอดภัยของ Firebase
/** * Starting point for running the program. Authenticates the user. * @param {function()} onAuthSuccess - Called when authentication succeeds. */ function initAuthentication(onAuthSuccess) { firebase.auth().signInAnonymously().catch(function(error) { console.log(error.code + ", " + error.message); }, {remember: 'sessionOnly'}); firebase.auth().onAuthStateChanged(function(user) { if (user) { data.sender = user.uid; onAuthSuccess(); } else { // User is signed out. } }); }
ส่วนถัดไปของโค้ดด้านล่างจะคอยฟังการคลิกบนแผนที่ ซึ่งจะเพิ่ม "child" ลงในฐานข้อมูล Firebase เมื่อเกิดกรณีนี้ขึ้น ฟังก์ชัน snapshot.val()
จะรับค่าข้อมูลของรายการและสร้างออบเจ็กต์ LatLng ใหม่
// Listen for clicks and add them to the heatmap. clicks.orderByChild('timestamp').startAt(startTime).on('child_added', function(snapshot) { var newPosition = snapshot.val(); var point = new google.maps.LatLng(newPosition.lat, newPosition.lng); heatmap.getData().push(point); } );
โค้ดด้านล่างจะตั้งค่า Firebase ให้ทําสิ่งต่อไปนี้
- ฟังเสียงคลิกบนแผนที่ เมื่อมีการคลิก แอปจะบันทึกการประทับเวลา จากนั้นเพิ่ม "รายการย่อย" ลงในฐานข้อมูล Firebase
- ลบการคลิกบนแผนที่ที่เก่ากว่า 10 นาทีแบบเรียลไทม์
/** * Set up a Firebase with deletion on clicks older than expirySeconds * @param {!google.maps.visualization.HeatmapLayer} heatmap The heatmap to * which points are added from Firebase. */ function initFirebase(heatmap) { // 10 minutes before current time. var startTime = new Date().getTime() - (60 * 10 * 1000); // Reference to the clicks in Firebase. var clicks = firebase.database().ref('clicks'); // Listen for clicks and add them to the heatmap. clicks.orderByChild('timestamp').startAt(startTime).on('child_added', function(snapshot) { // Get that click from firebase. var newPosition = snapshot.val(); var point = new google.maps.LatLng(newPosition.lat, newPosition.lng); var elapsedMs = Date.now() - newPosition.timestamp; // Add the point to the heatmap. heatmap.getData().push(point); // Request entries older than expiry time (10 minutes). var expiryMs = Math.max(60 * 10 * 1000 - elapsed, 0); // Set client timeout to remove the point after a certain time. window.setTimeout(function() { // Delete the old point from the database. snapshot.ref.remove(); }, expiryMs); } ); // Remove old data from the heatmap when a point is removed from firebase. clicks.on('child_removed', function(snapshot, prevChildKey) { var heatmapData = heatmap.getData(); var i = 0; while (snapshot.val().lat != heatmapData.getAt(i).lat() || snapshot.val().lng != heatmapData.getAt(i).lng()) { i++; } heatmapData.removeAt(i); }); }
คัดลอกโค้ด JavaScript ทั้งหมดในส่วนนี้ไปยังไฟล์ firebasemap.js
การสร้างแผนที่ความร้อน
ขั้นตอนถัดไปคือการแสดงแผนที่ความร้อนซึ่งแสดงจํานวนการคลิกสัมพัทธ์ในจุดต่างๆ บนแผนที่เป็นภาพกราฟิก ดูข้อมูลเพิ่มเติมได้ที่คู่มือเกี่ยวกับแผนที่ความร้อน
เพิ่มโค้ดด้านล่างภายในฟังก์ชัน initMap()
เพื่อสร้างแผนที่ความร้อน
// Create a heatmap. var heatmap = new google.maps.visualization.HeatmapLayer({ data: [], map: map, radius: 16 });
โค้ดด้านล่างจะเรียกใช้ฟังก์ชัน initFirebase
, addToFirebase
และ getTimestamp
initAuthentication(initFirebase.bind(undefined, heatmap));
โปรดทราบว่าหากคลิกแผนที่ความร้อน ระบบจะไม่สร้างจุด หากต้องการสร้างจุดบนแผนที่ คุณจะต้องตั้งค่าโปรแกรมฟังแผนที่
การสร้างจุดบนแผนที่ความร้อน
โค้ดด้านล่างจะเพิ่ม Listener ภายใน initMap()
หลังโค้ดที่สร้างแผนที่ โค้ดนี้จะรับฟังข้อมูลจากแต่ละคลิก จัดเก็บตําแหน่งการคลิกในฐานข้อมูล Firebase และแสดงจุดบนแผนที่ความร้อน
// Listen for clicks and add the location of the click to firebase. map.addListener('click', function(e) { data.lat = e.latLng.lat(); data.lng = e.latLng.lng(); addToFirebase(data); });
คลิกสถานที่บนแผนที่เพื่อสร้างจุดบนแผนที่ความร้อน
ตอนนี้คุณมีแอปพลิเคชันเรียลไทม์ที่ใช้งานได้เต็มรูปแบบโดยใช้ Firebase และ Maps JavaScript API
เมื่อคลิกแผนที่ความร้อน ตอนนี้ละติจูดและลองจิจูดของการคลิกควรปรากฏในฐานข้อมูล Firebase คุณดูข้อมูลนี้ได้โดยการเข้าสู่ระบบบัญชี Firebase แล้วไปที่แท็บข้อมูลของแอป เมื่อถึงจุดนี้ หากมีคนคลิกแผนที่ คุณจะเห็นว่าคุณและบุคคลนั้นเห็นจุดบนแผนที่ ตําแหน่งของการคลิกจะยังคงอยู่แม้ว่าผู้ใช้จะปิดหน้าเว็บแล้วก็ตาม หากต้องการทดสอบฟังก์ชันการทำงานแบบเรียลไทม์ ให้เปิดหน้าเว็บใน 2 หน้าต่างแยกกัน เครื่องหมายควรปรากฏในทั้ง 2 รายการแบบเรียลไทม์
ดูข้อมูลเพิ่มเติม
Firebase เป็นแพลตฟอร์มแอปพลิเคชันที่จัดเก็บข้อมูลเป็น JSON และซิงค์กับไคลเอ็นต์ที่เชื่อมต่อทั้งหมดแบบเรียลไทม์ ซึ่งจะใช้งานได้แม้ในขณะที่แอปออฟไลน์ บทแนะนำนี้ใช้ฐานข้อมูลแบบเรียลไทม์