рдиреЛрдХрд┐рдпрд╛ рдореИрдкреНрд╕ рдЬреЗрдПрд╕ рдПрдкреАрдЖрдИ рдФрд░ рдЯреНрд╡рд┐рдЯрд░ рд╕рд░реНрдЪ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореИрд╢рдЕрдк рд▓рд┐рдЦрдирд╛

рдкрд┐рдЫрд▓реЗ рд╣рдлреНрддреЗ, рдиреЛрдХрд┐рдпрд╛ рдореИрдкреНрд╕ рдХреЛ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдлрд╝реНрд▓рд┐рдХрд░ рдлреЛрдЯреЛ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдореИрд╢рдк рдерд╛ рдЬрд╣рд╛рдВ рдЖрдк рдирдХреНрд╢реЗ рдкрд░ рдЬрд┐рдпреЛрдЯреИрдЧ рдХрд┐рдП рдЧрдП рдЯреИрдЧ рдХреЗ рд╕рд╛рде рддрд╕реНрд╡реАрд░реЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред



рд╣рдордиреЗ рдиреЛрдХрд┐рдпрд╛ рдореИрдкреНрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореИрд╢рдЕрдк рдХреЗ рд╡рд┐рд╖рдп рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдФрд░ рдЖрдЬ рд╣рдо рджрд┐рдЦрд╛рдПрдВрдЧреЗ рдХрд┐ рдореИрдк рдкрд░ рдЯреНрд╡рд┐рдЯрд░ рдкрд░ рдХреБрдЫ рд╣реИрд╢рдЯреИрдЧ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рддреАрд╡реНрд░рддрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреЛрдХрд┐рдпрд╛ рдореИрдкреНрд╕ рдЬреЗрдПрд╕ рдПрдкреАрдЖрдИ + рдЯреНрд╡рд┐рдЯрд░ рд╕рд░реНрдЪ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдореИрд╢рдЕрдк рдиреАрдЪреЗ рдХреА рдЫрд╡рд┐ рдХреА рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛ред



рдкрд░рдВрдкрд░рд╛ рд╕реЗ, рд╣рдо index.html рдмрдирд╛рдХрд░ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░рд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдЖрд░рдВрднреАрдХреГрдд рд╣реЛрдЧрд╛:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>Nokia Maps Heatmap demo</title> <link rel="stylesheet" href="main.css"> </head> <body> <div id="annotations"> <h2></h2> </div> <div id="map" class="map"><div id="map-loading" class="map-loading"></div></div> <script src="http://api.maps.nokia.com/2.2.1/jsl.js?with=all"></script> <script src="places-heatmap.js"></script> <script src="process-tweets.js"></script> </body> </html> 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдордиреЗ рддреБрд░рдВрдд рддреАрди рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдкрд╣рдЪрд╛рди рдХреАред рдкрд╣рд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ api.maps.nokia.com/2.2.1/jsl.js api.maps.nokia.com/2.2.1/jsl.js рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдВрддрд┐рдо рдкреЛрд╕реНрдЯ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ - рдпрд╣ рдиреЛрдХрд┐рдпрд╛ рдореИрдкреНрд╕ рдЬреЗрдПрд╕ рдПрдкреАрдЖрдИ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред

places-heatmap.js рдХреЛ рдУрд╡рд░рд▓реЗ рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рдПрдХ рддреАрд╡реНрд░рддрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдФрд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд process-tweets.js рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╣реИрд╢рдЯреИрдЧ рдФрд░ рдЬрд┐рдпреЛрд▓реЛрдХреЗрд╢рди рдбреЗрдЯрд╛ рд╡рд╛рд▓реЗ рдЯреНрд╡реАрдЯреНрд╕ рдХреА process-tweets.js , рд╕рд╛рде рд╣реА рдЗрди рдЯреНрд╡реАрдЯреНрд╕ рдХреЛ рддреАрд╡реНрд░рддрд╛ рдХреЗ рдирдХреНрд╢реЗ рдХреА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ (рдЕрдХреНрд╖рд╛рдВрд╢ / рджреЗрд╢рд╛рдВрддрд░, рд╢рд╣рд░) рдХреЗ рд╕рд╛рде рдЬрд┐рдпреЛрдХреЛрдбрд┐рдВрдЧ рдХрд░рддреА рд╣реИред

рдЗрди рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╕реАрдзреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдХреЛрдб рдХреЛ рджрд┐рдП рдЬрд╛рдПрдВрдЧреЗред

рд╕реНрдерд╛рдиреЛрдВ-heatmap.js


 var HH = {}; //      Nokia Maps JS API nokia.Settings.set("appId", "_peU-uCkp-j8ovkzFGNU"); nokia.Settings.set("authenticationToken", "gBoUkAMoxoqIWfxWA5DuMQ"); nokia.Settings.set("defaultLanguage", "ru-RU"); HH.HeatmapLoader = function () { var self = this, map, mapLoad, heatmapLoad, heatmapProvider; //   ,       mapLoad = function () { var mapContainer = document.getElementById("map"); self.map = new nokia.maps.map.Display(mapContainer, { //     ,    zoomLevel: 3     center: [55, 37], zoomLevel: 3, components: [ new nokia.maps.map.component.Behavior() ] }); }; //    ,      heatmapLoad = function () { var color_range = { //       . //      1,   тАФ 0. stops: { //    ,        тАФ  ,       "0": "rgba(0, 0, 64, 1)", "0.15": "rgba(0, 0, 64, 1)", "0.3": "rgb(32, 32, 96)", "0.4": "rgb(96, 96, 128)", "0.5": "rgb(255, 255, 255)" }, //      ,     interpolate: true }; try { if(!self.heatmapProvider) { //     heatmapProvider = new nokia.maps.heatmap.Overlay({ //     colors: color_range, //   ,     max: 20, //   ,    opacity: 1, //     type: "density", //       coarseness: 1, //  ,   , ,     assumeValues: true }); } } catch (e) { //       , //      canvas alert(e); } //            if (heatmapProvider && HH.tweetheatmap) { //      heatmapProvider.clear(); heatmapProvider.addData(HH.tweetheatmap.allPlaces); //      self.map.overlays.add(heatmapProvider); } }; //      return { map: map, mapLoad: mapLoad, heatmapLoad: heatmapLoad, heatmapProvider: heatmapProvider }; }; //   HeatmapLoader HH.heatmap = new HH.HeatmapLoader(); 


рдЖрдк рдиреЛрдХрд┐рдпрд╛ рдореИрдкреНрд╕ рдПрдкреАрдЖрдИ рд╕рдВрджрд░реНрдн рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА nokia.maps.heatmap.Overlay рд╡рд░реНрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕рднреА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдУрд╡рд░рд▓реЗ рдХреА рдХреБрдЫ рд╕реЗрдЯрд┐рдВрдЧреНрд╕, рдЬреЛ nokia.maps.heatmap.Overlay.Options рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЗрдЯ рдХреА рдЧрдИ рд╣реИрдВ ред

рдкреНрд░рдХреНрд░рд┐рдпрд╛-tweets.js


 HH.TweetHeatmap = function () { "use strict"; var self, init, pageSetup, switchInput, changeHash, allPlaces = [], addPlaces, addSearch, tweetPlace, getLocation, addToPlace, futureCheck, futureCount = 0, rendered = false, locationsObj = {}, locationsTweets = [], displayHeatmap; init = function () { var locations, i; self = this; //     ,       if (nokia.maps && HH.heatmap) { HH.heatmap.mapLoad(); } //    ,   #nokia if (window.location.hash === '') { window.location.hash = 'nokia'; } pageSetup(); //   Twitter Search API    ,        locations = [[55.75697, 37.61502], [0, 100], [0, 50], [0, 0], [0, -50], [0, -100], [0, -150], [50, 150], [50, 100], [50, 50], [50, 0], [50, -50], [50, -100], [50, -150], [-50, 150], [-50, 100], [-50, 50], [-50, 0], [-50, -50], [-50, -100], [-50, -150]]; //    ,   ,    document.getElementById('map-loading').style.display = 'block'; //    ,   locations,      Twitter Search API    for (i in locations) { self.addSearch(locations[i], window.location.hash.substring(1)); } //           , //   ,  ,    setTimeout(displayHeatmap, 8000); }; //  JSONP-     ,  Twitter Search API //     addPlaces addSearch = function (location, hashtag) { //  Twitter Search API   : https://dev.twitter.com/docs/api/1/get/search var url = 'http://search.twitter.com/search.json?geocode=' + location[0] + ',' + location[1] + ',8000km&q=%23' + hashtag + '&rpp=100&callback= HH.tweetheatmap.addPlaces', script = document.createElement("script"); script.setAttribute("src", url); document.body.appendChild(script); }; //     ,       addPlaces = function (data) { var i; if (data && data.results && data.results.length) { //    . self.futureCount += data.results.length; for (i = data.results.length - 1; i >= 0; i--) { var location = data.results[i].location if (location) { location = location.replace('iPhone: ','') self.getLocation(location); } else { //       ,     self.futureCount--; } }; } }; //  JSONP-  Nokia Maps geocode API    Twitter       getLocation = function (location) { // q тАФ  , vi тАФ  , dv тАФ  , to тАФ     var url = 'http://where.desktop.mos.svc.ovi.com/json?q=' + encodeURI(location) + '&to=1&vi=address&dv=NokiaMapsAPI&callback_func=HH.tweetheatmap.addToPlace', script = document.createElement("script"); script.setAttribute("src", url); document.body.appendChild(script); }; //      ,  //       addToPlace = function (data) { if (data.results && data.results.length) { var location_title = data.results[0].properties.title, type = data.results[0].properties.type, lon = data.results[0].properties.geoLongitude, lat = data.results[0].properties.geoLatitude; if (type != 'Country' && type != 'State' && type != 'Continent'){ if (locationsObj[location_title]) { locationsTweets[locationsObj[location_title]].tweets += 1; } else { locationsObj[location_title] = locationsTweets.length locationsTweets.push({ 'city': location_title, 'tweets': 1, 'longitude': lon, 'latitude': lat }); } } if (!rendered) { allPlaces.push({ "latitude" : lat, "longitude" : lon, "city" : location_title, "country" : data.results[0].properties.addrCountryName }); } } self.futureCheck(); }; //      ,   . //   ,       futureCheck = function () { self.futureCount--; if (self.futureCount<=0) { displayHeatmap(); } }; //   ,       displayHeatmap = function() { if(!rendered) { rendered = true; document.getElementById('map-loading').style.display = 'none'; HH.heatmap.heatmapLoad(); } }; // ,             switchInput = function(e){ this.style.display='none'; var h = document.createElement('input');h.setAttribute('type', 'text'); this.parentNode.insertBefore(h,this); h.focus(); h.addEventListener('keydown', changeHash, false); }; changeHash = function(e){ if(e.keyCode===13) { window.location.hash='#'+e.target.value.replace('#',''); } else if(e.keyCode===27) { e.target.parentNode.removeChild(e.target); document.getElementsByTagName('h2')[0].style.display='block'; } }; pageSetup = function() { if (!(document.getElementsByTagName('body')[0].classList.length === 1)) { //       URL document.getElementsByTagName('h2')[0].innerHTML = '#' + window.location.hash.substring(1); //  event listener      document.getElementsByTagName('h2')[0].addEventListener('click', switchInput, false) //  event listener        window.addEventListener("hashchange", function (e) {window.location.reload(); }, false); } }; //      return { init: init, addSearch: addSearch, addPlaces : addPlaces, addToPlace : addToPlace, getLocation: getLocation, futureCount : futureCount, futureCheck : futureCheck, allPlaces : allPlaces, locationsTweets : locationsTweets }; }; HH.tweetheatmap = new HH.TweetHeatmap(); HH.tweetheatmap.init(); 


рдЯреНрд╡рд┐рдЯрд░ рд╕рд░реНрдЪ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдореЗрдВ рдПрдХ рдордирдорд╛рдирд╛ рддреНрд░рд┐рдЬреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкреГрдереНрд╡реА рдХреА рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░) рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдЯреНрд╡реАрдЯреНрд╕ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реИ, рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рдпрд╣ 100 рд╕реЗ рдЕрдзрд┐рдХ рдЯреНрд╡реАрдЯ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХрдИ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕рдВрджреЗрд╢ рдЦреЛрдЬ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред

process-tweets.js рдХреЗ рдЕрдВрдд рдореЗрдВ process-tweets.js рдЖрдк рдЙрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕реАрдзреЗ рдЯреНрд╡рд┐рдЯрд░ рд╕рд░реНрдЪ рдПрдкреАрдЖрдИ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИрдВред рд╡реЗ рд╣рдорд╛рд░реЗ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ рдФрд░ рд╡рд░реНрддрдорд╛рди рд╣реИрд╢рдЯреИрдЧ (рдКрдкрд░реА рдмрд╛рдПрдВ рдХреЛрдиреЗ рдореЗрдВ) рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рд╡рд╛рдпрд╛ document.getElementsByTagName('h2')[0].innerHTML = '#' + window.location.hash.substring(1); рд╣рдо рдПрдХ рд╣реИрд╢рдЯреИрдЧ рдХреЛ URL рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ - рдЗрд╕ рддрд░рд╣ рд╣рдорд╛рд░реЗ index.html рдХреЛ рдХрд┐рд╕реА рднреА рд╣реИрд╢рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП iframe рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕рд╛рдЗрдЯ рдкрд░ рдбрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕реНрд░реЛрдд рджреЗрдЦреЗрдВ


рдПрдХ рдЬреАрд╡рдВрдд рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВред рд╕реВрддреНрд░реЛрдВ рдХреЛ рдЬреАрдердм рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдПрдкреАрдЖрдИ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛


Source: https://habr.com/ru/post/In149320/


All Articles