I'm working on switching from OpenLayers 2 to OpenLayers 3 and supplementing my reading of The Book of OpenLayers 3 <https://leanpub.com/thebookofopenlayers3/feedback> by trying some things out on my own. There's a project that I'm building here <http://www.tandooriallstars.com/tom/index2.php> that should be fairly simple: take form inputs and use them as parameters for building a vector layer. The interface works as intended, save for one problem.
Whenever I pan the map or zoom it, the vector layer seems to disappear. I can't for the life of me imagine what's going on. Anyone able to help me figure out what I can do to keep the layer in place? Thanks! Dheeraj Code: <!DOCTYPE html> <html> <head> <title>Chicago Data</title> <script src="https://code.jquery.com/jquery-1.11.2.min.js"></script> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ol3/3.6.0/ol.css" type="text/css"> <link rel="stylesheet" href="styles.css" type="text/css"> <link href='https://fonts.googleapis.com/css?family=Playfair+Display:400,400italic,700,700italic,900' rel='stylesheet' type='text/css'> <link href='https://fonts.googleapis.com/css?family=Montserrat:400,700' rel='stylesheet' type='text/css'> <script src="https://cdnjs.cloudflare.com/ajax/libs/ol3/3.6.0/ol.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.4.0/lodash.js"></script> </head> <body> <div class="container"> <div class="row upper text-center"><!-- intro text --> <div class="col-md-12"> <h1>Chicago Crimes Data Browser</h1> <h2>This is a simple interface to work with spatial data using <a href="http://www.openlayers.org">OpenLayers 3</a>.</h2> <hr/> <h3>Please select both a year and a crime category to visualise, then click on the map!</h3> </div> </div><!-- END UPPER --> <div class="row text-center"><!-- radio buttons top --> <div class="col-md-4 col-md-offset-2" id="year"> <h5>Year</h5> <div class="radio-container"> <div class="radio"> <label> <input type="radio" name="yearGroup" value="2016" checked> 2016 </label> </div> <div class="radio"> <label> <input type="radio" name="yearGroup" value="2015"> 2015 </label> </div> </div> </div> <div class="col-md-4" id="category"> <h5>Crime Category</h5> <div class="radio-container"> <div class="radio"> <label> <input type="radio" name="categoryGroup" value="BURGLARY" checked> Burglary </label> </div> <div class="radio"> <label> <input type="radio" name="categoryGroup" value="HOMICIDE"> Homicide </label> </div> </div> </div> </div><!-- end radio buttons bottom --> <div class="row text-center"> <button class="btn btn-primary" type="submit" id="mapit">Map It</button> </div> <div class="row map"><!-- map section --> <div class="col-md-12" id="map"></div> </div><!-- end map --> <div id="tabular"><!-- table section --> <div class="row text-center"> <div class="col-md-6 col-md-offset-3"> <h3 class="map-output">Crimes in Chicago 2015</h3> </div> </div> <div class="row text-center"> <div class="col-md-2 col-md-offset-4"> <h4 class="grid-headline grid-headline-ward">Ward</h4> </div> <div class="col-md-2"> <h4 class="grid-headline grid-headline-count">Count</h4> </div> </div> <div class="row text-center"> <div class="col-md-2 col-md-offset-4"> <p class="table-data">1</p> </div> <div class="col-md-2"> <p class="table-data">15</p> </div> </div> <div class="row text-center"> <div class="col-md-2 col-md-offset-4"> <p class="table-data">2</p> </div> <div class="col-md-2"> <p class="table-data">34</p> </div> </div> </div><!-- end table section --> <div class="row"><!-- footer --> <div class="col-md-12 footer"> <div id="footer"><p>This the footer div. Copyright <a href="http://www.clarityandrigour.com">Clarity and Rigour 2016</a>. Please contact Dheeraj or John for more information.</p></div> </div> </div><!-- end footer --> </div><!--END CONTAINER --> <script> /* The following is material to be used in helper functions*/ var styleCache = {}, // create styleCache variable defaultStyle = new ol.style.Style({ stroke: new ol.style.Stroke({ color: [220, 220, 220, 1], width: 1 }) }), // default uggeaux style color1 = [250, 250, 250, 1], color2 = [250, 128, 128, 1], color3 = [250, 64, 64, 1], color4 = [250, 0, 0, 1], color5 = [128, 0, 0, 1], colorLevels = { 0: color1, 0.2: color2, 0.4: color3, 0.6: color4, 0.8: color5, }; // map the classfication level codes to a colour value, grouping them /* The following is helper functions that will be called by jQuery */ function computeMinMaxFromProperty(total_data, property, year) { var geometries = (total_data.objects[year].geometries), incidents = _(geometries).map(function (g) { if (property in g.properties) { return g.properties[property]; } }) .filter() .value() .sort(function (a, b) { return a - b; }); var minMax = { min: _(incidents).min(), max: _(incidents).max() }; return minMax; } // close function definition for compute minMax function buildStyle(feature, resolution, property, minMax) { var theMin = minMax['min'], theMax = minMax['max'], incidentsCount = feature.get(property); var classification = _(colorLevels).keys() .map(function (cl) { if (((incidentsCount - theMin) / (theMax - theMin)) >= Number(cl)) { return Number(cl); } }) .max() if (!incidentsCount || !colorLevels[classification]) { return [defaultStyle]; } // check styleCache if (!styleCache[classification]) { styleCache[classification] = new ol.style.Style({ fill: new ol.style.Fill({ color: colorLevels[classification] }), stroke: defaultStyle.stroke }); return [styleCache[classification]]; } }// close buildstyle function buildLayer(property, minMax, filePath) { var vectorLayer = new ol.layer.Vector({ source: new ol.source.Vector({ url: filePath, format: new ol.format.TopoJSON() }), style: function (feat, res) { return buildStyle(feat, res, property, minMax); } }); map.addLayer(vectorLayer); } //close function definition for buildlayer /* The following is OL3 code to build the map*/ // create base layer var osmLayer = new ol.layer.Tile({ source: new ol.source.OSM() }); // populate the map, centred on Chicago var map = new ol.Map({ layers: [osmLayer], target: 'map', view: new ol.View({ center: ol.proj.transform([-87.623177, 41.881832], 'EPSG:4326', 'EPSG:3857'), zoom: 10, minZoom: 10 }) }); // now we are going to listen for changes to the radio buttons and build a layer accordingly $('#mapit').on('click', function (event) { var year = $("#year input:checked").val(), category = $("#category input:checked").val(), filePath = './topojsons/' + year + '.topo.json', styleCache = {}; $.getJSON(filePath).then(function (data) { return computeMinMaxFromProperty(data, category, year); }).then(function (minMax) { buildLayer(category, minMax, filePath); }) }); </script> </body> </html>
_______________________________________________ Users mailing list us...@lists.osgeo.org http://lists.osgeo.org/mailman/listinfo/openlayers-users