diff --git a/css/app.css b/css/app.css index 342d260..dcf9453 100644 --- a/css/app.css +++ b/css/app.css @@ -122,3 +122,25 @@ border: 1px solid; /* background-color: lightblue; */ } + +.daterangepicker { + background-color: inherit !important; +} + +.daterangepicker * { + background-color: inherit !important; +} + +.daterangepicker td.in-range { + background-color: yellow !important; + color: black !important; +} + +.daterangepicker td.start-date { + background-color: yellow !important; + color: black !important; +} + +.applyBtn { + background-color: green !important; +} diff --git a/index.html b/index.html index 5699d2a..77c8fb1 100644 --- a/index.html +++ b/index.html @@ -1,6 +1,7 @@
+ @@ -93,6 +94,7 @@ @@ -134,19 +136,20 @@ - + + + + + - - + - - - + @@ -168,6 +171,8 @@ + + diff --git a/js/controller.js b/js/controller.js index faa8cec..c2b59eb 100644 --- a/js/controller.js +++ b/js/controller.js @@ -1,3 +1,35 @@ +// Accuracy: 10 +// +// Activity: "Unknown" +// +// Elevation: 142.9706268310547 +// +// Heading: 218.3203125 +// +// Name: "Big Papa" +// +// Notes: "" +// +// Pressure: 100.49606148077184 +// +// Speed: 0.20999999344348907 +// +// Time: "2018-12-05T20:16:51.998Z" +// +// UUID: "E96EEFB7-3A69-434D-9453-8BBFE0C22542" +// +// UnixTime: 1544041011 +// +// Version: "V.VersionV2" +// +// clustered: true +// +// point_count: 10 +// +// sqrt_point_count: 3.16 +// +// tippecanoe_feature_density: 0 + var ct = ct || {}; var view = view || {}; var model = model || {}; @@ -6,21 +38,24 @@ model.lastKnownData = null; model.visitsData = {}; model.visitsParams = { // defacto defaults - "googleNearby": "true", - "endI": "200", - "stats": "true", + data: { + "googleNearby": true, + "endI": 200, + "stats": true, + "names": ["Big Papa"] + }, set: function(key, val) { // use 'null' val to unset key (acts as delete) if (val === null) { - delete this[key]; - return this; + delete this.data[key]; + return this.data; } // allow assigning entire object if ((typeof key).toLowerCase() === "object") { - Object.assign(this, key); + Object.assign(this.data, key); return this; } - this[key] = val; + this.data[key] = val; return this; }, get: function() { @@ -28,7 +63,13 @@ model.visitsParams = { cd("visits off"); return $.ajax(); } // return empty ajax to keep promise returnable - var url = queryURL(trackHost, "/visits2?", this); + cd("GET visits this.data=", this.data); + // hacky workaround cuz bouncer wants to fuck with the query params for ?url=... + var url = queryURL("", "", this.data); + url = trackHost + "/visits2" + url; + // var e = URI.encode( "catonmap.info:3001" + queryURL("", "", this.data) ); + // var e = URI( "catonmap.info:3001" + queryURL("", "", this.data) ).href; + // var url = URI("https://bigger.space").addSearch("reset", true).addSearch("url", e).href(); cd("GET", url); return $.ajax(qJSON(url)); } @@ -52,15 +93,20 @@ model.getState = function() { ur = window.history; } + if (typeof ur["drawUuids"] === "string") { + ur["drawUuids"] = [ur["drawUuids"]]; + } + return { zoom: ur["zoom"] || 12, - lat: ur["lat"] || 38.613651383524335, // 32, - lng: ur["lng"] || -90.25388717651369, - baseLayer: ur["baseLayer"] || "terrain", - tileLayer: ur["tileLayer"] || "activity", - visits: ( ur["visits"] === "false" ) ? false : true, - follow: ur["follow"] || "", - windowStyle: ur["window"] || "light" + lat: ur["lat"] || 38.613651383524335, // 32, + lng: ur["lng"] || -90.25388717651369, + baseLayer: ur["baseLayer"] || "terrain", + tileLayer: ur["tileLayer"] || "activity", + visits: (ur["visits"] === "false") ? false : true, + follow: ur["follow"] || "", + windowStyle: ur["window"] || "light", + drawUuids: ur["drawUuids"] || [] }; }; @@ -85,54 +131,229 @@ model.errorMetadata = function(err) { }; var ago3days = moment().add(-3, "days").unix(); -ct.settings = { - on: false, - // on: true, - filter: { - // "t": function(p, z, l) { - // // if (!objExists(p.TimeUnix)) { - // // cd("noexit", p); - // // } - // return p.UnixTime > ago3days; - // } - }, - follow: null +ct.filter = { + comparator: "", // any, all, none + rules: [] + }; -ct.settingsFilter = function(props, zoom, layer) { - if (!ct.settings.hasOwnProperty("on") || - !ct.settings["on"] || - !ct.settings.hasOwnProperty("filter")) return true; // no filter settings applied, or disabled (on=false) - for (var k in ct.settings.filter) { - if (!ct.settings.filter.hasOwnProperty(k)) { - continue; +var doExistential = function(feat, comparator, key) { + if (comparator === "has") { + return feat.hasOwnProperty(key); + } else if (comparator === "!has") { + return !feat.hasOwnProperty(key) || typeof feat[key] === "undefined" || feat[key] === "null"; + } + return null; +}; + +var doMembership = function(feat, comparator, key, set) { + if (comparator === "in") { + return set.indexOf(feat[key]) > -1; + } else if (comparator === "!in") { + return set.indexOf(feat[key]) === 0; + } + return null; +}; + +var doComparison = function(feat, comparator, key, val) { + cd("doComparison", feat, comparator, key, val); + return (comparator === "==" && feat[key] === val) || + (comparator === "==" && +feat[key] === val) || + (comparator === "!=" && feat[key] !== val) || + (comparator === "<=" && (+feat[key] <= val)) || + (comparator === ">=" && (+feat[key] >= val)) || + (comparator === ">" && (+feat[key] > val)) || + (comparator === "<" && (+feat[key] < val)); +}; + +var handleDoComp = function(feat, comp) { + if ((comp[0].indexOf("=") >= 0) || (comp[0].indexOf("<") >= 0) || (comp[0].indexOf(">") >= 0)) { + return doComparison(feat, comp[0], comp[1], comp[2]); + } else if (comp[0].indexOf("has") >= 0) { + return doExistential(feat, comp[0], comp[1]); + } else if (comp[0].indexOf("in") >= 0) { + return doMembership(feat, comp[0], comp[1], comp[2]); + } + return null; +}; + +var Nn = 0; +var runCondoperator = function(feat, condop, conditions) { + if (Nn === 0) { + cd("cond", condop, "condi", conditions); + } + if (condop === "any") { + for (var i = 0; i < conditions.length; i++) { + var c = conditions[i]; + // [comparator, key, target] + if (handleDoComp(feat, c)) { + return true; + } + } + return false; + } else if (condop === "all") { + for (var j = 0; j < conditions.length; j++) { + var c = conditions[j]; + // [comparator, key, target] + if (!handleDoComp(feat, c)) { + return false; + } } - var fn = ct.settings.filter[k]; - if (!fn(props, zoom, layer)) { - return false; + return true; + } else if (condop === "none") { + for (var k = 0; k < conditions.length; k++) { + var c = conditions[k]; + // [comparator, key, target] + if (handleDoComp(feat, c)) { + return false; + } } + return true; } - return true; + return null; }; -ct.setSettingsFilter = function(key, fn) { - if (objExists(fn)) { - ct.settings["on"] = true; - ct.settings["filter"] = ct.settings["filter"] || {}; - ct.settings["filter"][key] = fn; - } else { - if (ct.settings.hasOwnProperty("filter")) { - if (ct.settings.filter.hasOwnProperty(key)) { - delete ct.settings.filter[key]; +ct.settings = { + // for persisting + filtering : [], + period : null, // {} w/ begin, theend ((unix)) + + // for logicing + // comps: [{ + // "all": ["<=", "Elevation", 200] + // }, {"any": ...}], + comps : [], + initComps : function() { + var comps = []; // reset comps + + if (this.period !== null) { + cd("initing periods comps"); + comps.push({ + all: [ + [">=", "UnixTime", this.period.start], + ["<=", "Unixtime", this.period.end] + ] + }); + } + + var ff = model.getState().drawUuids; + cd("ff", ff); + if (ff.length > 0) { + cd("initing ff length"); + var f = { + any: [] + }; + for (var j = 0; j < ff.length; j++) { + f.any.push(["==", "UUID", ff[j]]); } - if (Object.keys(ct.settings.filter).length === 0) { - ct.settings.on = false; + comps.push(f); + } + cd("comps inited", comps); + return; + }, + setFiltering : function(filteringA) { + this.filtering = []; + for ( var z = 0; z < filteringA.length; z++) { + this.filtering[z] = filteringA[z]; + } + + model.setState("drawUuids", this.filtering); + cd('filtering', filteringA, this.filtering); + this.initComps(); + return ; + }, + setPeriod : function(start, end) { + this.period = this.period || {}; + if (start + end === 0) { + this.period = null; + this.initComps(); + return; + } + var st = (start > 0 ? start : moment().add(-500, "years").unix()); + var en = (end > 0 ? end : moment().add(500, "years").unix()); + this.period.start = st; + this.period.end = en; + this.initComps(); + return; + }, + check : function(feat) { + if (Nn === 0) { + // cd("settingsFilter feat", props, zoom, layer); + cd("thiscomps", this.comps); + Nn++; + } + for (var c = 0; c < this.comps.length; c++) { + var comp = this.comps[i]; + var op = Object.keys(comp)[0]; + var result = runCondoperator(feat, op, comp[op]); + if (result === false) { + return false; + } else if (result === null) { + cd("BAD OP", op, comp); } } + Nn++; + return true; + }, +}; + +ct.settingsFilter = function(props, zoom, layer) { + if (Nn === 0) { + cd("settingsFilter feat", props, zoom, layer); } - cd("ct.settings", ct.settings); + var o = ct.settings.check(props); + cd("o", o); + return o; }; +// ct.settings = { +// on: false, +// // on: true, +// filter: { +// // "t": function(p, z, l) { +// // // if (!objExists(p.TimeUnix)) { +// // // cd("noexit", p); +// // // } +// // return p.UnixTime > ago3days; +// // } +// }, +// follow: null +// }; +// ct.settingsFilter = function(props, zoom, layer) { +// if (!ct.settings.hasOwnProperty("on") || +// !ct.settings["on"] || +// !ct.settings.hasOwnProperty("filter")) return true; // no filter settings applied, or disabled (on=false) + +// for (var k in ct.settings.filter) { +// if (!ct.settings.filter.hasOwnProperty(k)) { +// continue; +// } +// var fn = ct.settings.filter[k]; +// if (!fn(props, zoom, layer)) { +// return false; +// } +// } +// return true; +// }; + +// ct.setSettingsFilter = function(key, fn) { +// if (objExists(fn)) { +// ct.settings["on"] = true; +// ct.settings["filter"] = ct.settings["filter"] || {}; +// ct.settings["filter"][key] = fn; +// } else { +// if (ct.settings.hasOwnProperty("filter")) { +// if (ct.settings.filter.hasOwnProperty(key)) { +// delete ct.settings.filter[key]; +// } +// if (Object.keys(ct.settings.filter).length === 0) { +// ct.settings.on = false; +// } +// } +// } +// cd("ct.settings", ct.settings); +// }; + model.getLocalStore = function(key) { if (objExists(ct.browserSupportsLocal) && !ct.browserSupportsLocal) { return null; @@ -277,7 +498,7 @@ ct.dataLoop = function(n) { // setTimeout(view.mapState.goUpdateEdge, 60*1000); view.mapState.setPBFOpt(""); - setTimeout(ct.dataLoop, (n || 30) * 1000); + setTimeout(ct.dataLoop, (n || 300) * 1000); }; ct.init = (function() { @@ -358,7 +579,7 @@ ct.onVisits = function(visits, overwrite) { ct.markerClusterGroup.addLayer(v.marker(view.mapState.getMap())); // cd("new visit marker", v); } - cd("marker cluster group", ct.markerClusterGroup); + // cd("marker cluster group", ct.markerClusterGroup); view.mapState.setLayer("visits", ct.markerClusterGroup); }; @@ -484,16 +705,17 @@ ct.setViewStyle = function(lightOrDark) { $("#datetimepicker1").daterangepicker({ timePicker: true, - startDate: moment().startOf("year"), - endDate: moment().startOf("hour").add(32, "hour"), + startDate: moment().startOf("month"), + endDate: moment().startOf("hour").add(1, "hour"), ranges: { - 'Today': [moment(), moment()], - 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')], + 'Today': [moment().startOf("day"), moment()], + 'Yesterday': [moment().subtract(1, 'days').startOf("day"), moment().subtract(1, 'days').endOf("day")], 'Last 7 Days': [moment().subtract(6, 'days'), moment()], 'Last 30 Days': [moment().subtract(29, 'days'), moment()], "Last 6 Months": [moment().subtract(6, "months"), moment()], - 'This Month': [moment().startOf('month'), moment().endOf('month')], - 'This Year': [moment().startOf('year'), moment()] + 'This Month': [moment().startOf('month'), moment()], + 'This Year': [moment().startOf('year'), moment()], + "Anytime": [moment(10000), moment(10000)] // 'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')] }, locale: { @@ -501,7 +723,17 @@ ct.setViewStyle = function(lightOrDark) { } }, function(start, end, label) { - cd(start, end, label); + cd("start", start.unix(), "end", end.unix()); + var un = moment(10000); + var s = start.unix(); + var e = end.unix(); + if (start.isSame(un)) { + s = 0; + } + if (end.isSame(un)) { + e = 0; + } + ct.settings.setPeriod(s, e); }); }); diff --git a/js/lastknown.js b/js/lastknown.js index 7f543db..379e10c 100644 --- a/js/lastknown.js +++ b/js/lastknown.js @@ -132,28 +132,23 @@ var dataLastKnownEntry = { }; var filter = function(e) { cl("dobuleclick"); - var t = $(e.target).closest(".lastKnown"); - t.toggleClass("filtering"); + var t = $(e.target).closest(".lastKnown").toggleClass("filtering"); - // FIXME: this should be peristable (ajax reqs every 30secs break the UI here) var filterers = []; $(".lastKnown.filtering").each(function(i, el) { - var n = $(el).attr("data-iid"); - var as = model.lastKnownData.get(n).aliases; - cd("aliases", as); - filterers = filterers.concat(as.slice()); + var n = $(el).data("uuid"); + filterers.push(n); }); - var fn = function(props, zoom, layer) { - return $.inArray(props.Name, filterers) > -1; - }; - if (filterers.length === 0) { - fn = null; - } - ct.setSettingsFilter("viewables", fn); - view.mapState.setPBFOpt(localOrDefault("l", "activity")); + ct.settings.setFiltering(filterers); + // trigger tile reload + view.mapState.setPBFOpt(model.getState().tileLayer); + + // rm visits layer view.mapState.setLayer("visits", null); - model.visitsParams.set("names", filterers) + + // regrab visits + model.visitsParams.set("uuids", filterers) .get() .done(model.setVisits) .catch(model.errVisits); @@ -172,6 +167,7 @@ var dataLastKnownEntry = { `) .attr("data-uid", this.uid()) + .attr("data-uuid", this.uuid) .attr("data-iid", this.iid()) .attr("data-name", this.name) .attr("data-lat", this.lat) @@ -182,6 +178,13 @@ var dataLastKnownEntry = { this.e.find(".catname").append($("").attr("href", "http://punktlich.rotblauer.com/install").attr("target", "_").text("Outdated Version " + this.version).addClass("badge badge-warning ml-2")); } + if (ct.settings.filtering.indexOf(this.uuid) >= 0 ) { + cd("filteringon uuuiii", this.uuid); + this.e.closest(".lastKnown").addClass("filtering"); + } else { + // cd("filtering no on", ct.settings); + } + // FIXME this.ln.append(this.e); @@ -235,7 +238,7 @@ healthkit=(${no.numberOfSteps} steps, distance: ${no.distance.toFixed(0)}m, sinc } else if (vv.isDeparture()) { con = "Departed " + con + " " + vv.arrivalDate.fromNow(); } else { - // con = "Spent " + vv.departureDateLocal.to(vv.arrivalDateLocal, true) + " + " at " + con " + // con = "Spent " + vv.departureDateLocal.to(vv.arrivalDateLocal, true) + " + " at " + con " con = `Spent ${vv.departureDateLocal.to(vv.arrivalDateLocal, true)} at ${vv.PlaceParsed.Identity}, left ${vv.departureDate.fromNow()}`; } var vis = $( `${con}`).css("cursor", "pointer").on("click", function() { diff --git a/js/mapstate.js b/js/mapstate.js index 9956c2f..7e9e611 100644 --- a/js/mapstate.js +++ b/js/mapstate.js @@ -24,7 +24,7 @@ var mapStateFn = function() { return; } - cd("_overlayLayers", _overlayLayers); + // cd("_overlayLayers", _overlayLayers); if (layer === null) { if (_overlayLayers[name]) { var l = _overlayLayers[name]; @@ -38,7 +38,7 @@ var mapStateFn = function() { cd("removing layer", name, layer); _map.removeLayer(_overlayLayers[name]); } - cd("adding layer", name, layer); + // cd("adding layer", name, layer); _overlayLayers[name] = layer; _map.addLayer(layer); }; @@ -50,15 +50,16 @@ var mapStateFn = function() { return tileHost + "/" + id + "/{z}/{x}/{y}"; // return tileHost + "/{z}/{x}/{y}" + ".geojson"; }; - var _pbfLayerOpts = { - "activity": ct.baseTilesLayerOptsF("activity"), - "recent": ct.baseTilesLayerOptsF("recent"), - "speed": ct.baseTilesLayerOptsF("speed"), - "density": ct.baseTilesLayerOptsF("density") + var _pbfLayerOpts = function(name) { + return ct.baseTilesLayerOptsF(name); + // "activity": ct.baseTilesLayerOptsF("activity"), + // "recent": ct.baseTilesLayerOptsF("recent"), + // "speed": ct.baseTilesLayerOptsF("speed"), + // "density": ct.baseTilesLayerOptsF("density") }; var _pbfOpts = function(optName) { - if (_pbfLayerOpts.hasOwnProperty(optName)) { - return _pbfLayerOpts[optName]; + if (vectorTileLayerStyles.hasOwnProperty(optName)) { + return _pbfLayerOpts(optName); } return {}; }; diff --git a/js/pbfopts.js b/js/pbfopts.js index 1c5c1fb..1368f02 100644 --- a/js/pbfopts.js +++ b/js/pbfopts.js @@ -1,3 +1,47 @@ +// https://stackoverflow.com/questions/340209/generate-colors-between-red-and-green-for-a-power-meter/340214#340214 +function percentToRGB(percent) { + if (percent >= 100) { + percent = 99 + } + var r, g, b; + if (percent < 50) { + // green to yellow + r = Math.floor(255 * (percent / 50)); + g = 255; + + } else { + // yellow to red + r = 255; + g = Math.floor(255 * ((50 - percent % 50) / 50)); + } + // b = 0; + + b = g; + g = 0; + + return "rgb(" + r + "," + g + "," + b + ")"; +} + + +var elevMin = -100, + elevMax = 3500; + // elevMax = 10300; + +var elevChromaLow = chroma.scale(["navy", "green", "yellow"]).domain([elevMin, 180 , elevMax]).gamma(0.5).correctLightness(); +var elevChromaHigh = chroma.scale([ "pink", "red"]).domain([elevMax, 10300]).gamma(10).correctLightness(); +ct.elevationFn = function(props, z, layer) { + props.Elevation = props.Elevation || 0; + var el = props.Elevation.toFixed(0); + return { + stroke: false, + fill: true, + fillColor: ( el < elevMax ? elevChromaLow(el) : elevChromaHigh(el) ), + fillOpacity: 1, + radius: 2, + type: "Point" + }; +}; + var activityColorLegend = { "": "lightgray", "Unknown": "lightgray", @@ -158,30 +202,6 @@ ct.speedFn = function(properties, zoom, layer) { // tippecanoe_feature_density: 8 // -// https://stackoverflow.com/questions/340209/generate-colors-between-red-and-green-for-a-power-meter/340214#340214 -function percentToRGB(percent) { - if (percent >= 100) { - percent = 99 - } - var r, g, b; - if (percent < 50) { - // green to yellow - r = Math.floor(255 * (percent / 50)); - g = 255; - - } else { - // yellow to red - r = 255; - g = Math.floor(255 * ((50 - percent % 50) / 50)); - } - // b = 0; - - b = g; - g = 0; - - return "rgb(" + r + "," + g + "," + b + ")"; -} - // -ag or --calculate-feature-density: Add a new attribute, tippecanoe_feature_density, to each feature, to record how densely features are spaced in that area of the tile. You can use this attribute in the style to produce a glowing effect where points are densely packed. It can range from 0 in the sparsest areas to 255 in the densest. var maxDensity = 62; //255; var maxRadius = 8; @@ -190,21 +210,6 @@ var zRangeMin = 3; var zRangeMax = 19; var zRangeDiff = zRangeMax - zRangeMin; -// At lower (farther out) zooms, we should "desensitize" scaling since most points will be "clustered" in higher numbers, -// whereas at higher (closer) zooms, we should adjust tolerance to be more centered around lower feature_density values. -function getRelDensity(zoom, n) { - var stepSize = maxDensity / zRangeDiff; // 255 / 17 = 15 - var stepN = zoom - 1; - var lower = maxDensity - (stepN * stepSize); - if (n < lower) { - n = lower; - } - var mldiff = maxDensity - lower; - var rel = n - lower; - var relDensity = rel / mldiff; - return relDensity; -} - var tfds = [], tfdSum = 0, @@ -226,8 +231,8 @@ var noClus = 0; -var minPC = 1000, - maxPC = 5000, // 10000 // 59534, // 172, //351, // 172, //9, +var minPC = 2, + maxPC = 10000, // 10000 // 59534, // 172, //351, // 172, //9, rangePC = maxPC - minPC; var minTFD = 0, @@ -239,77 +244,81 @@ ct.densityFn = function(properties, zoom, layer) { properties.point_count = properties.point_count || minPC; var n = properties.point_count > properties.tippecanoe_feature_density ? ((properties.point_count - minPC) / rangePC) : ((properties.tippecanoe_feature_density - minTFD) / rangeTFD); - if (nnn % 1000 === 0) { - if (properties.clustered) { - pcs.push(properties.point_count); - pcSum += properties.point_count; - pcAvg = pcSum / pcs.length; - pcMax = Math.max.apply(Math, pcs); - pcMin = Math.min.apply(Math, pcs); - pcMin = Math.min.apply(Math, pcs); - } else { - noClus++; - } - - ns.push(n); - nSum += n; - nAvg = nSum / ns.length; - nMax = Math.max.apply(Math, ns); - nMin = Math.min.apply(Math, ns); - nMin = Math.min.apply(Math, ns); - - tfds.push(properties.tippecanoe_feature_density); - tfdSum += properties.tippecanoe_feature_density; - tfdAvg = tfdSum / tfds.length; - tfdMax = Math.max.apply(Math, tfds); - tfdMin = Math.min.apply(Math, tfds); - tfdMin = Math.min.apply(Math, tfds); - - cd("1/1000", nnn, "n=", n, properties); - - cd( - "n.len=", ns.length, - "n.avg=", nAvg, - "n.min=", nMin, - "n.max=", nMax, - ); - - cd( - "tfd.len=", tfds.length, - "tfd.avg=", tfdAvg, - "tfd.min=", tfdMin, - "tfd.max=", tfdMax, - ); - - cd( - "noclus(==nopc).ln=", noClus, - "pc.len=", pcs.length, - "pc.avg=", pcAvg, - "pc.min=", pcMin, - "pc.max=", pcMax, - ); - cd("z", view.mapState.getMap().getZoom()); - - } + // if (nnn % 100 === 0) { + // if (properties.clustered) { + // pcs.push(properties.point_count); + // pcSum += properties.point_count; + // pcAvg = pcSum / pcs.length; + // pcMax = Math.max.apply(Math, pcs); + // pcMin = Math.min.apply(Math, pcs); + // pcMin = Math.min.apply(Math, pcs); + // } else { + // noClus++; + // } + + // ns.push(n); + // nSum += n; + // nAvg = nSum / ns.length; + // nMax = Math.max.apply(Math, ns); + // nMin = Math.min.apply(Math, ns); + // nMin = Math.min.apply(Math, ns); + + // tfds.push(properties.tippecanoe_feature_density); + // tfdSum += properties.tippecanoe_feature_density; + // tfdAvg = tfdSum / tfds.length; + // tfdMax = Math.max.apply(Math, tfds); + // tfdMin = Math.min.apply(Math, tfds); + // tfdMin = Math.min.apply(Math, tfds); + + // if (nnn % 1000 === 0) { + // cd(//"1/1000", nnn, + // "n=", n, + // properties); + + // cd( + // "n.len=", ns.length, + // "n.avg=", nAvg, + // "n.min=", nMin, + // "n.max=", nMax, + // ); + + // cd( + // "tfd.len=", tfds.length, + // "tfd.avg=", tfdAvg, + // "tfd.min=", tfdMin, + // "tfd.max=", tfdMax, + // ); + + // cd( + // "noclus(==nopc).ln=", noClus, + // "pc.len=", pcs.length, + // "pc.avg=", pcAvg, + // "pc.min=", pcMin, + // "pc.max=", pcMax, + // ); + // cd("z", view.mapState.getMap().getZoom()); + // } + // } - if (properties.Visit && properties.Visit !== "") { - cd("visit", properties.Visit); - } - nnn++; + // if (properties.Visit && properties.Visit !== "") { + // cd("visit", properties.Visit); + // } + // nnn++; if (!ct.settingsFilter(properties, zoom, layer)) { return {}; } var fillColor = function(p) { - return percentToRGB((p) * 100); + return percentToRGB((p) * 1000); }; var fillOpacity = function(p) { - var o = 1- (1/p.toFixed(2)); + var o = 1 - (1 / p.toFixed(2)); return o > 0.2 ? o : 0.2; }; var radius = function(p) { p = (p > 1 ? 1 : p); + var pp = 1/(1 - (p)); var r = (maxRadius * p); return r > 1 ? r : 1; }; @@ -399,7 +408,12 @@ var vectorTileLayerStyles = { "density": { 'catTrack': ct.densityFn, 'catTrackEdge': ct.densityFn - } + }, + "elevation": { + 'catTrack': ct.elevationFn, + 'catTrackEdge': ct.elevationFn + }, + }; ct.baseTilesLayerOptsF = function(name) { diff --git a/js/util.js b/js/util.js index fe2c783..a1a762b 100644 --- a/js/util.js +++ b/js/util.js @@ -31,26 +31,14 @@ function sleep(delay) { var queryURL = function queryURL(host, path, paramsObj) { var u = URI(host+path); - - // var q = ""; - // var n = 0; for (var key in paramsObj) { if (!paramsObj.hasOwnProperty(key) || typeof paramsObj[key] === "function") { continue; } var v = paramsObj[key]; - // for php... suckas - // if (Object.prototype.toString.call( someVar ) === '[object Array]') { - // key = key+"[]"; - // } u.addSearch(key, v); } return u.href(); - // q = encodeURIComponent(q); - // if ((host+path).slice(-1) !== "?") { - // q = "?" + q; - // } - // return host + path + q; }; var qJSON = function qJSON(url) { @@ -114,23 +102,6 @@ var localOrDefault = function(key, def) { return ls; }; -function assembleStateURL() { - var latlng = map.getCenter(); - var lat = latlng.lat; - var lng = latlng.lng; - var z = map.getZoom(); - var wl = window.location.origin; - var vv = $("#visits-checkbox").is(":checked") ? "yes" : "no"; - var text = wl + "?z=" + z + - "&y=" + lng + - "&x=" + lat + - "&l=" + drawnLayer + - "&t=" + getCurrentTileLayerName() + - "&s=" + globalSinceFloor + - "&v=" + vv; - return text; -} - // http://stackoverflow.com/questions/5560248/programmatically-lighten-or-darken-a-hex-color-or-rgb-and-blend-colors function shadeRGBColor(color, percent) { var f = color.split(","),