use*_*530 1 filtering geojson d3.js
我正在实现经典的墨卡托示例(https://github.com/mbostock/d3/blob/master/examples/mercator/mercator.html),我已将其更改为放大到阿富汗并仅使用一个自定义滑块。我正在读取发生爆炸的地方的GeoJSON数据,并且该图将它们全部映射为负载状态。我想使用滑块一次仅查看一个月的爆炸点,但是在过滤结果时遇到了麻烦。我已经根据Google小组中的帖子尝试了几件事,但是无法理解如何过滤以前从'explosions.json'中读取的数据。谢谢您的帮助!
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<title>IED Attacks in Afghanistan (2004-2009)</title>
<script type="text/javascript" src="../d3.v2.js"></script>
<script type="text/javascript" src="../lib/jquery/jquery.min.js"></script>
<script type="text/javascript" src="../lib/jquery-ui/jquery-ui.min.js"></script>
<style type="text/css">
@import url("../lib/jquery-ui/jquery-ui.css");
body, .ui-widget {
font: 14px Helvetica Neue;
}
svg {
width: 960px;
height: 600px;
border: solid 1px #ccc;
background: #eee;
}
line {
stroke: brown;
stroke-dasharray: 4,2;
}
path {
fill: #ccc;
stroke: #fff;
}
div {
width: 960px;
}
</style>
</head>
<body>
<h3>IED Attacks in Afghanistan (2004-2009)</h3>
<script type="text/javascript">
// Create the Mercator Projection (Map)
var xy = d3.geo.mercator(),
path = d3.geo.path().projection(xy);
// Create the states variable
var states = d3.select("body")
.append("svg")
.append("g")
.attr("id", "states");
// Create the equator variable
var equator = d3.select("svg")
.append("line")
.attr("x1", "0%")
.attr("x2", "100%");
// Create the explosions variable
var explosions = d3.select("svg")
.append("g")
.attr("id","explosions");
// Load in the states & equator data from the file 'world-countries.json'
d3.json("world-countries.json", function(collection) {
states
.selectAll("path")
.data(collection.features)
.enter().append("path")
.attr("d", path)
.append("title")
.text(function(d) { return d.properties.name; });
equator
.attr("y1", xy([0, 0])[1])
.attr("y2", xy([0, 0])[1]);
});
// the variable that holds our translate, center on Afghanistan
var translate = xy.translate(); //create translation to center gride in different area
translate[0] = -1741;
translate[1] = 1487;
xy.translate(translate); // center
xy.scale(12000); //zoom in
// Load in the explosions data from the file 'explosions.json'
d3.json("explosions.json", function(collection) {
explosions
.selectAll("path") //make a path and attach data
.data(collection.features)
.enter().append("path")
.attr("d", path)
.style("stroke","red") //color the path points
.style("stroke-width",2) //size of point stroke
.attr("class","explosionpoint")
.append("title") //title is the 'name' field in the json file
.text(function(d) { return d.properties.name; });
});
</script>
<p></p>
<!-- Slider -->
<div id="scale"></div><p></p>
<script type="text/javascript">
$("#scale").slider({
min: 20040101, //min : 1/1/04
max: 20100101, //max: 1/1/10
value: 20060601, //default slider value
step: 100, // step is the allow increments the slider can move. 100 = one month
slide: function(event, ui) {
/* REMOVE ALL EXPLOSION PATHS EXCEPT FOR A PARTICULAR MONTH OR RELOAD WITH FILTERED RESULTS */
}
});
</script>
Run Code Online (Sandbox Code Playgroud)
您需要发布部分或全部explains.json对象,以获得具体答案。但是,如果类似JSON,则类似这样的内容将过滤JSON {explosion1:{data1:true, data2:true}, explosion2:{data1:true, data2:false}}
:
function filterJSON(json, key, value) {
var result = {};
for (var explosionIndex in json) {
if (json[explosionIndex][key] === value) {
result[explosionIndex] = json[explosionIndex];
}
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
(例如,filterJSON(myjson, "data1", true)
将使用data1:true进行所有爆炸)
这并非特定于d3。
然后,您可以在d3面使用类似的方法:
explosions.data(myFilteredData).exit().remove(); // remove ones you don't want
explosions.enter().append("path")... // add back ones you do want
Run Code Online (Sandbox Code Playgroud)
如果我了解您的应用程序,那么实际上最好切换visiblity
SVG元素的属性。
var sliderrange = [20040101, 20040201]; //replace with code based on your slider
explosions.selectAll(".explosionpoint").attr("visibility", function(d) {
//Replace with the correct date comparison logic
return d.date < sliderrange[1] && d.date > sliderrange[0] ? "visible" : "hidden";
});
Run Code Online (Sandbox Code Playgroud)
D3 确实有一种非常自然的方式来做到这一点。我假设您的数据如下所示:
[{name: explosion1name, day: 20040110,...}, {name: explosion2name, day: 20040111,...}]
Run Code Online (Sandbox Code Playgroud)
...而且你有一些变量,我们称之为explosionsData
,以引用数据。
然后,您可以使用从滑块中获取值的函数绘制爆炸。请参阅.filter
我在下面添加的内容。
function drawExplosions(startDay, endDay) {
explosions.selectAll("path") //make a path and attach data
.data(collection.features)
.enter().append("path")
.filter( function (d) { return ( (d.day > startDay) && (d.day < endDay) )})
.attr("d", path)
.style("stroke","red") //color the path points
.style("stroke-width",2) //size of point stroke
.attr("class","explosionpoint")
.append("title") //title is the 'name' field in the json file
.text(function(d) { return d.properties.name; });
Run Code Online (Sandbox Code Playgroud)
每当您的滑块值发生变化时,只需调用此函数即可。
归档时间: |
|
查看次数: |
11268 次 |
最近记录: |