<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no"> <title>StreamLayer using ArcGIS API for JavaScript and ArcGIS GeoEvent Processor for Server</title> <link rel="stylesheet" href="http://js.arcgis.com/3.8/js/dojo/dijit/themes/tundra/tundra.css"> <link rel="stylesheet" href="http://js.arcgis.com/3.8/js/esri/css/esri.css"> <style type="text/css"> html, body { height: 100%; width: 100%; margin: 0; padding: 0; } body{ background-color: #fff; overflow:hidden; font-family: sans-serif; } #map { width: 100%; height: 80%; } </style> <script src="http://js.arcgis.com/3.8/"></script> </head> <body class="tundra"> <div id="map"></div> <div> <span>Enter websocket connection: </span><input type="text" id="txtWsUrl" value="ws://localhost.esri.com:6180/StreamService" style="width: 400px"/><br/> <input type="button" id="cmdNewStream" value="Make Stream Layer" /> <input type="button" id="cmdDisconnect" value="Disconnect Stream Layer" /> </div> </body> <script> var curTime = new Date(); var curTimeStamp = Date.parse(curTime.toUTCString()); var layerDefinition = { "geometryType": "esriGeometryPoint", "timeInfo": { "startTimeField": "created_at", "endTimeField": null, "trackIdField": "id_str", "timeReference": null, "timeInterval": 1, "timeIntervalUnits": "esriTimeUnitsSeconds", "exportOptions": { "useTime": true, "timeDataCumulative": false, "timeOffset": null, "timeOffsetUnits": null }, "hasLiveData": true }, "fields": [ { name: "text", type: "esriFieldTypeString", alias: "text" }, { name: "created_at", type: "esriFieldTypeDate", alias: "created at" }, { name: "retweet_count", type: "esriFieldTypeInteger", alias: "retweet count" }, { name: "id_str", type: "esriFieldTypeString", alias: "id_str" } ] }; var map, featureCollection, streamLayer; require(["esri/map", "esri/TimeExtent", "esri/layers/StreamLayer", "esri/InfoTemplate", "esri/symbols/SimpleMarkerSymbol", "esri/symbols/SimpleLineSymbol", "esri/renderers/SimpleRenderer", "esri/renderers/TimeClassBreaksAger", "esri/renderers/TemporalRenderer", "dojo/_base/Color", "dojo/dom", "dojo/on", "dojo/domReady!" ], function(Map, TimeExtent, StreamLayer, InfoTemplate, SimpleMarkerSymbol, SimpleLineSymbol, SimpleRenderer, TimeClassBreaksAger, TemporalRenderer, Color, dom, on){ var trackedBusses = {}, cnt = 0; map = new Map("map",{ basemap: "gray", center: [-96, 36.428], zoom: 4 }); // event listeners for button clicks on(dom.byId("cmdNewStream"), "click", makeNewStreamLayer); on(dom.byId("cmdDisconnect"), "click", disconnectStreamLayer); function makeStreamLayer(){ //Make FeatureCollection to define layer without using url featureCollection = { "layerDefinition": null, "featureSet": { "features": [], "geometryType": "esriGeometryPoint"} }; featureCollection.layerDefinition = layerDefinition; // Instantiate StreamLayer // 1. socketUrl is the url to the GeoEvent Processor web socket. // 2. purgeOptions.displayCount is the maximum number of features the // layer will display at one time // 3. trackIdField is the name of the field that groups features var layer = new StreamLayer(featureCollection, { socketUrl: txtWsUrl.value, purgeOptions: { displayCount: 500 }, trackIdField: featureCollection.layerDefinition.timeInfo.trackIdField, infoTemplate: new InfoTemplate("tweet: ${text}", "Timestamp: ${created_at}" ) }); console.log("TrackID: ", featureCollection.layerDefinition.timeInfo.trackIdField); console.log("TrackID: ", layer.timeInfo.trackIdField); //Make renderer and apply it to StreamLayer var renderer = makeRenderer(); layer.setRenderer( renderer ); //Subscribe to onMessage event of StreamLayer so can adjust map time layer.on("message", processMessage); return layer; } // Process message that StreamLayer received. function processMessage(message){ if (featureCollection.layerDefinition.timeInfo && featureCollection.layerDefinition.timeInfo.startTimeField) { var timestamp = message[0].attributes[featureCollection.layerDefinition.timeInfo.startTimeField]; if (! map.timeExtent){ map.setTimeExtent(new esri.TimeExtent(new Date(timestamp), new Date(timestamp))); console.log("TIME EXTENT: ", map.timeExtent); } else { var tsEnd = Date.parse(map.timeExtent.endTime.toString()); if (timestamp > tsEnd){ map.setTimeExtent(new esri.TimeExtent(map.timeExtent.startTime, new Date(timestamp))); console.log("TIME EXTENT: ", map.timeExtent); } } } } // Make new StreamLayer and add it to map. function makeNewStreamLayer(){ disconnectStreamLayer(); streamLayer = makeStreamLayer(); map.addLayer( streamLayer ); } // Disconnect StreamLayer from websocket and remove it from the map function disconnectStreamLayer(){ if (streamLayer){ streamLayer.suspend(); streamLayer.disconnect(); streamLayer.clear(); map.removeLayer(streamLayer); streamLayer = null; //map.timeExtent = null; } } // Make temporal renderer with latest observation renderer function makeRenderer(){ var obsRenderer = new SimpleRenderer( new SimpleMarkerSymbol("circle", 8, new SimpleLineSymbol("solid", new Color( [5, 112, 176, 0] ), 1), new Color( [5, 112, 176, 0.4] ) )); var latestObsRenderer = new SimpleRenderer( new SimpleMarkerSymbol("circle", 12, new SimpleLineSymbol("solid", new Color( [5, 112, 176, 0] ), 1), new Color( [5, 112, 176] ) )); var temporalRenderer = new TemporalRenderer(obsRenderer, latestObsRenderer, null, null); return temporalRenderer; } }); </script> </html>
Les membres connectés peuvent publier, suivre les mises à jour, et plus encore. Nouveau ici ? Inscrivez-vous gratuitement.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.