Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add vector map #1

Closed
wants to merge 54 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
74f9769
bootstrap
thomasneirynck Feb 17, 2017
5ee857b
enable WMS
thomasneirynck Feb 21, 2017
6b5de89
extract choropleth in separate class
thomasneirynck Feb 21, 2017
8ce0273
isolate geohash layer in separate module
thomasneirynck Feb 21, 2017
13d20f8
add desaturation flag / more efficient refreshing of baselayer
thomasneirynck Feb 22, 2017
828218b
add remaining map types
thomasneirynck Feb 22, 2017
cb9a8fc
add fit control
thomasneirynck Feb 24, 2017
3d0cca7
add legend control
thomasneirynck Feb 27, 2017
ba4ee90
add tooltip flag
thomasneirynck Feb 28, 2017
8e0dfe1
some simplification
thomasneirynck Feb 28, 2017
a15d182
fix choropleth
thomasneirynck Feb 28, 2017
292013d
do not request manifest on route-change, instead call it when creatin…
thomasneirynck Feb 28, 2017
f10fcb7
fix typo
thomasneirynck Feb 28, 2017
2bc1ab9
add rendercomplete
thomasneirynck Feb 28, 2017
d244e08
initial review
thomasneirynck Feb 28, 2017
4c7c7b1
fix resizing
thomasneirynck Feb 28, 2017
7b81cd2
add tooltips
thomasneirynck Mar 1, 2017
7004101
add legend
thomasneirynck Mar 1, 2017
e9a93b3
fix linting errors
thomasneirynck Mar 1, 2017
fa129f5
add rendercomplete
thomasneirynck Mar 1, 2017
8e4d9a8
fix package json
thomasneirynck Mar 1, 2017
b9e9a8a
make 0 the default
thomasneirynck Mar 3, 2017
bedda29
disable multi tile-map support
thomasneirynck Mar 3, 2017
e38865d
use the ResizeChecker
thomasneirynck Mar 3, 2017
cde89f9
use yml for layer config
thomasneirynck Mar 5, 2017
f0beb5e
use default config
thomasneirynck Mar 5, 2017
75387e6
persist ui state
thomasneirynck Mar 5, 2017
fd1b028
add default controls
thomasneirynck Mar 5, 2017
abb4173
use kui UX
thomasneirynck Mar 5, 2017
6f7bf51
use geocentroid as new default
thomasneirynck Mar 6, 2017
c6dac35
add support for states
thomasneirynck Mar 6, 2017
c3e12fa
fix config loading
thomasneirynck Mar 6, 2017
e8dccec
extract classes in separate files
thomasneirynck Mar 17, 2017
49b2fd6
do not hardcode map zoom level to calculate max zoom
thomasneirynck Mar 17, 2017
0592e68
resolve style issues
thomasneirynck Mar 17, 2017
0760ee4
fix rebase issues
thomasneirynck Mar 20, 2017
2fbf93e
add default data files
thomasneirynck Mar 21, 2017
380c975
remove unused LOC
thomasneirynck Mar 21, 2017
77895c7
dedupe ui-state persistence
thomasneirynck Mar 21, 2017
7a162d0
filter icons on bound
thomasneirynck Mar 23, 2017
1bd9f1e
remove listeners on layer removal;
thomasneirynck Mar 23, 2017
e68fbdf
small styling changes
thomasneirynck Mar 23, 2017
dfe1d93
remove vector map
thomasneirynck Mar 23, 2017
472aa5c
fix styling
thomasneirynck Mar 24, 2017
00e65b9
move logic of adding geo_centroid to geo_hash agg
thomasneirynck Mar 24, 2017
8d6ecfb
move files
thomasneirynck Mar 24, 2017
3f64542
fix zoom on save
thomasneirynck Mar 24, 2017
e54805a
update data on refresh
thomasneirynck Mar 24, 2017
3ad2567
removed unused files
thomasneirynck Mar 24, 2017
f8201a8
fix tooltips for heatmaps
thomasneirynck Mar 24, 2017
36fda64
make heatmap tooltips not flicker
thomasneirynck Mar 24, 2017
6d735f0
remove obsolete files
thomasneirynck Mar 24, 2017
726cf0a
resolve linter errors
thomasneirynck Mar 24, 2017
335b561
readd vector map
thomasneirynck Mar 24, 2017
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/core_plugins/choropleth/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
export default function (kibana) {

return new kibana.Plugin({
uiExports: {
visTypes: ['plugins/choropleth/choropleth_vis']
}
});

}
4 changes: 4 additions & 0 deletions src/core_plugins/choropleth/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"name": "choropleth",
"version": "kibana"
}
7 changes: 7 additions & 0 deletions src/core_plugins/choropleth/public/choropleth.less
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
.choropleth-vis {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
3 changes: 3 additions & 0 deletions src/core_plugins/choropleth/public/choropleth_controller.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<div ng-controller="KbnChoroplethController" class="choropleth-vis">

</div>
141 changes: 141 additions & 0 deletions src/core_plugins/choropleth/public/choropleth_controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
import uiModules from 'ui/modules';
import 'plugins/kbn_vislib_vis_types/controls/vislib_basic_options';
import _ from 'lodash';
import AggConfigResult from 'ui/vis/agg_config_result';
import KibanaMap from 'ui/vis_maps/kibana_map';
import FilterBarFilterBarClickHandlerProvider from 'ui/filter_bar/filter_bar_click_handler';
import ChoroplethLayer from './choropleth_layer';
import colorramps from 'ui/vislib/components/color/colormaps';
import AggResponsePointSeriesTooltipFormatterProvider from './tooltip_formatter';
import { ResizeCheckerProvider } from 'ui/resize_checker';

const module = uiModules.get('kibana/choropleth', ['kibana']);
module.controller('KbnChoroplethController', function ($scope, $element, Private, getAppState, tilemapSettings) {

const filterBarClickHandler = Private(FilterBarFilterBarClickHandlerProvider);
const tooltipFormatter = Private(AggResponsePointSeriesTooltipFormatterProvider);
const ResizeChecker = Private(ResizeCheckerProvider);

const resizeChecker = new ResizeChecker($element);
const containerNode = $element[0];

let kibanaMap = null;
resizeChecker.on('resize', () => {
if (kibanaMap) {
kibanaMap.resize();
}
});
let choroplethLayer = null;

async function makeKibanaMap() {

if (!tilemapSettings.isInitialized()) {
await tilemapSettings.loadSettings();
}

const minMaxZoom = tilemapSettings.getMinMaxZoom(false);
kibanaMap = new KibanaMap(containerNode, minMaxZoom);
const url = tilemapSettings.getUrl();
const options = tilemapSettings.getTMSOptions();
kibanaMap.setBaseLayer({ baseLayerType: 'tms', options: { url, ...options } });
kibanaMap.addLegendControl();
kibanaMap.addFitControl();
kibanaMap.persistUiStateForVisualization($scope.vis);
}

const kibanaMapReady = makeKibanaMap();
$scope.$watch('esResponse', async function (response) {

kibanaMapReady.then(() => {
const metricsAgg = _.first($scope.vis.aggs.bySchemaName.metric);
const termAggId = _.first(_.pluck($scope.vis.aggs.bySchemaName.segment, 'id'));
let results;
if (!response || !response.aggregations) {
results = [];
} else {
const buckets = response.aggregations[termAggId].buckets;
results = buckets.map((bucket) => {
return {
term: bucket.key,
value: getValue(metricsAgg, bucket)
};
});
}

if (!$scope.vis.params.selectedJoinField) {
$scope.vis.params.selectedJoinField = $scope.vis.params.selectedLayer.fields[0];
}
updateChoroplethLayer($scope.vis.params.selectedLayer.url);
choroplethLayer.setMetrics(results, metricsAgg);
if ($scope.vis.aggs.bySchemaName.segment && $scope.vis.aggs.bySchemaName.segment[0]) {
const fieldName = $scope.vis.aggs.bySchemaName.segment[0].params.field.name;
choroplethLayer.setTooltipFormatter(tooltipFormatter, metricsAgg, fieldName);
} else {
choroplethLayer.setTooltipFormatter(tooltipFormatter, metricsAgg, null);
}

kibanaMap.useUiStateFromVisualization($scope.vis);
kibanaMap.resize();
$element.trigger('renderComplete');
});
});

$scope.$watch('vis.params', (visParams) => {
kibanaMapReady.then(() => {
if (!visParams.selectedJoinField) {
visParams.selectedJoinField = visParams.selectedLayer.fields[0];
}

updateChoroplethLayer(visParams.selectedLayer.url);
choroplethLayer.setJoinField(visParams.selectedJoinField.name);
choroplethLayer.setColorRamp(colorramps[visParams.colorSchema]);

kibanaMap.setShowTooltip(visParams.addTooltip);
kibanaMap.setLegendPosition(visParams.legendPosition);
kibanaMap.useUiStateFromVisualization($scope.vis);
kibanaMap.resize();
$element.trigger('renderComplete');
});
});

function updateChoroplethLayer(url) {

if (choroplethLayer && choroplethLayer.equalsGeoJsonUrl(url)) {
return;
}
kibanaMap.removeLayer(choroplethLayer);

const previousMetrics = choroplethLayer ? choroplethLayer.getMetrics() : null;
const previousMetricsAgg = choroplethLayer ? choroplethLayer.getMetricsAgg() : null;
choroplethLayer = new ChoroplethLayer(url);
if (previousMetrics && previousMetricsAgg) {
choroplethLayer.setMetrics(previousMetrics, previousMetricsAgg);
}
choroplethLayer.on('select', function (event) {
const appState = getAppState();
const clickHandler = filterBarClickHandler(appState);
const aggs = $scope.vis.aggs.getResponseAggs();
const aggConfigResult = new AggConfigResult(aggs[0], false, event, event);
clickHandler({ point: { aggConfigResult: aggConfigResult } });
});
kibanaMap.addLayer(choroplethLayer);
}

});





function getValue(metricsAgg, bucket) {
let size = metricsAgg.getValue(bucket);
if (typeof size !== 'number' || isNaN(size)) {
try {
size = bucket[1].values[0].value;//lift out first value (e.g. median aggregations return as array)
} catch (e) {
size = 1;//punt
}
}
return size;
}

Loading