- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 d3 创建交互式 map ,使用 json 文件创建边界,但我停在需要显示一层的地方,在我的情况下将是首都城市,单击它时将创建另一层对于较小的城市,由于所有数据都在一个 json 文件中,但我们可以知道如果 name_1 ==name_2 则它是首都(第 1 层),否则只有在单击第 1 层时才会出现较小的城市(第 2 层)
这就是我的代码,它同时显示第 1 层和第 2 层
//Width and height
var width = 600,
height = 600
var color = d3.scaleLinear()
.range(["rgb(254,224,210)","rgb(252,146,114)","rgb(222,45,38)"]);
//Define map projection //projection
var projection = d3.geoMercator()
.translate([0, 0])
.scale(1);
//Define path generator
var path = d3.geoPath()
.projection(projection);
//Create SVG element
var svg = d3.select("body")
.append("svg")
.attr("width", width)
.attr("height", height);
svg.append("rect")
.attr("class", "background")
.attr("width", width)
.attr("height", height)
.on("click", clicked);
var g = svg.append("g");// <g> element is used to group SVG shapes together
//Load in GeoJSON data
d3.json("JOR_layer3.json", function(error,json) {//jordan.geo
if (error) throw error;
// Calculate bounding box transforms for entire collection
var b = path.bounds( json ),
s = 0.95 / Math.max((b[1][0] - b[0][0]) / width, (b[1][1] - b[0][1]) / height),
t = [(width - s * (b[1][0] + b[0][0])) / 2, (height - s * (b[1][1] + b[0][1])) / 2];
console.log (json.features);
json.features.forEach(function (d) {
console.log (d.properties.NAME_1);
})
// Update the projection
projection
.scale(s)
.translate(t);
//Bind data and create one path per GeoJSON feature
g.append("g")
.attr("id", "city-polygon")
.selectAll("path")
.data(json.features)
.enter()
.append("path")
.attr("d", path)
.style("fill", function (d, i) { //console.log (d);
return color(i);})
/*.style('stroke', 'white')
.style('stroke-width', 0.7);*/
.on("click", clicked);
g.selectAll(".city-name")
.data(json.features)
.enter()
.append("text")
.attr("class", "city")
.attr("transform", function(d) {
var centroid = path.centroid(d),
x = centroid[0],
y = centroid[1];
return "translate(" + x + "," + y + ")";
// + "scale(1)"
// + "translate(" + -x + "," + -y + ")";
})
.attr('text-anchor', 'middle')
.text (function (d) { return d.properties.NAME_2; });
});
function clicked(d) {
var x, y, k;
if (d && centered !== d) {
var centroid = path.centroid(d);
x = centroid[0];
y = centroid[1];
k = 4;
centered = d;
} else {
x = width / 2;
y = height / 2;
k = 1;
centered = null;
}
g.selectAll("#path")
.classed("active", centered && function(d) { return d === centered; });
g.transition()
.duration(750)
.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")scale(" + k + ")translate(" + -x + "," + -y + ")")
.style("stroke-width", 1.5 / k + "px");
}
以及 json 文件的示例
{"type":"FeatureCollection","bbox":[34.95763778686535,29.18587875366211,39.30208587646493,33.36817169189466],
"features":[{"type":"Feature","properties":{"ID_0":116,"ISO":"JOR","NAME_0":"Jordan","ID_1":1,"NAME_1":"Ajlun","ID_2":1,"NAME_2":"Ajlun",
"HASC_2":"JO.AJ.AJ","CCN_2":0,"CCA_2":null,"TYPE_2":"Nahia","ENGTYPE_2":"Sub-Province","NL_NAME_2":null,"VARNAME_2":"Ajlun"},
"geometry":{"type":"Polygon","coordinates":[[[35.709953308105526,32.38688278198248],[35.7218132019043,32.38408279418957],[35.737407684326115,32.38139343261719],
[35.740989685058594,32.380111694335994],[35.7465705871582,32.376800537109375],[35.706249237060604,32.372310638427734],[35.709953308105526,32.38688278198248]]]}},"type":"Feature","properties":{"ID_0":116,"ISO":"JOR","NAME_0":"Jordan","ID_1":1,"NAME_1":"Ajlun","ID_2":2,"NAME_2":"Kofranjah",
"HASC_2":"JO.AJ.KF","CCN_2":0,"CCA_2":null,"TYPE_2":"Nahia","ENGTYPE_2":"Sub-Province","NL_NAME_2":null,"VARNAME_2":null},
"geometry":{"type":"Polygon","coordinates":[[[35.74267196655279,32.16957473754883],[35.733383178710994,32.174312591552734],
[35.72740554809576,32.17792892456055],[35.72211837768566,32.181858062744254],[35.754566192626896,32.18144989013672],[35.74267196655279,32.16957473754883]]]}}]}
最佳答案
如果我理解正确,您的问题需要对此陈述的解决方案:
I need to show one layer ... the capital cities and when it is clicked another layer will be created for the smaller cities
上下文是这样的:
<小时/>all the data are in one json file
对于这个答案,我不会在点击时放大每个区域,因为问题是关于根据点击显示数据。我还使用 d3 v4,它可以提供更简单的 fitExtent
方法来自动翻译和缩放 map - 我建议您看一下。然而,在本例中,我只是使用手动定义的投影来实现更简单、更清晰的演示。
对于这个问题,一种方法似乎是最简单和自然的:立即绘制所有特征,但隐藏一些数据,以便稍后可以切换:
因此,对于您的数据来说,这可能如下所示:
g.selectAll(".primary-city")
.data(jordan.features)
.enter()
.filter(function(d) { return d.properties.name_1 == d.properties.name_2 })
.append("text")
.attr("class", "primary-city")
.attr("transform", function(d) { return 'translate('+path.centroid(d)+')'; })
.attr('y',-10)
.attr('text-anchor', 'middle')
.text (function (d) { console.log(d); return d.properties.name_2; });
g.selectAll(".secondary-city")
.data(jordan.features)
.enter()
.filter(function(d) { return d.properties.name_1 != d.properties.name_2 })
.append("text")
.attr("class", "secondary-city")
.attr("transform", function(d) { return 'translate('+path.centroid(d)+')'; })
.attr('y',-10)
.attr('opacity',0)
.attr('pointer-events','none')
.attr('text-anchor', 'middle')
.text (function (d) { console.log(d); return d.properties.name_2; });
上面的代码会将您的 geojson 分成两个不同的“层”,并按类名分隔。二级城市的名称在绘制时将被隐藏(不透明度 = 0)。
现在您所需要的只是让点击事件调用以下函数:
var clicked = false;
function click() {
clicked = !clicked;
if (clicked == true) {
g.selectAll(".secondary-city")
.transition()
.attr('opacity',1)
.duration(400);
}
else {
g.selectAll(".secondary-city")
.transition()
.attr('opacity',0)
.duration(400);
}
}
这看起来是什么样子的?好吧,我已经组装了一个 block ,这样你就可以看到 here (我认为使用相同的数据源。此外,您必须单击约旦中的某个功能才能触发它)。如果您希望将点击分配给特定的地理特征,您可以对路径采取与过滤文本类似的方法,并使用类来区分。
关于javascript - 使用点击事件的两层 d3 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42449862/
我正在尝试从一个 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 m
我是 Haskell 的新手,我认为函数 map map和 map.map在 Haskell 中是一样的。 我的终端给了我两种不同的类型, (map.map) :: (a -> b) -> [[a]
我的目标是创建一个 map 的 map ,这样我就可以通过它的键检索外部 map 的信息,然后通过它们的键访问它的“内部” map 。 但是,当我得到每个内部映射时,我最初创建的映射变成了一个对象,我
如何使用 Java8 编写以下代码? for (Entry> entry : data.entrySet()) { Map value = entry.getValue(); if (valu
我有覆盖整个南非的图片。它们为Tiff格式,并已将坐标嵌入其中。我正在尝试拍摄这些图像(大约20张图像),并将它们用作我的iPhone应用程序中的地图叠加层。我的问题在于(准确地)将地图切成图块。 我
所以我有 2 std::map s >一个是“旧的”,一个是“新的”,我想知道哪些文件被删除了,这样就能够遍历差异并对 shared_ptr 做一些事情。这样的事情可能吗?如何做到? 最佳答案 虽然
是否可以将当前查看的 google.maps.Map 转换为静态图像链接,以便我可以获取图像并将其嵌入到 PDF 中? 我在 map 上添加了一些带有自定义图标的标记,所以我不确定这是否真的可行。 如
你能帮我吗 Java Streams ? 从标题可以看出我需要合并List>>进入Map> . 列表表示为List>>看起来像: [ { "USER_1":{
对于 idAndTags 的第二个条目,内部映射被打乱,但第一个条目则不然 第一次接近! for (Map.Entry> entryOne : idAndTags.entrySet()) {
我将从我的代码开始,因为它应该更容易理解我想要做什么: @function get-color($color, $lightness) { @return map-get(map-get($col
我过去曾在许多网站上使用过 Google map ,但遇到了以前从未遇到过的问题。 map 窗口正在显示,但它只显示左上角的 map 片段,以及之后的任何内容(即使我在周围导航时),右侧也不会加载任何
众所周知,这些 map ,无论是常规街道 map 还是卫星 map ,在中国的特定地区都无法正确排列。那么哪个 map 排列正确,是卫星 map 还是默认街道 map ?一些网站表明卫星 map 是正
在拖尾事件之后,我面临着获取此处 map 中的 map 边界的问题。我需要新的经纬度来在新更改的视口(viewport)中获取一些项目/点。我只是想在拖动结束时获得谷歌地图map.getBounds(
我想做的是通过 ajax API 显示以英国邮政编码为中心的小型 bing 生成 map 。我相信这是可能的;我在 Bing map 文档中找不到如何将英国邮政编码转换为可以插入 map Ajax 控
我有一个 List我想转换成的 e Map>其中外部字符串应为“Name”,内部字符串应为“Domain”。 Name Id Domain e(0) - Emp1, 1, Insuran
我的第 2 部分:https://stackoverflow.com/questions/21780627/c-map-of-maps-typedef-doubts-queries 然后我继续创建 I
是否可以在 1 行中使用 Java8 编写以下所有 null 和空字符串检查? Map> data = new HashMap<>(holdings.rowMap()); Set>> entrySet
我正在审查一个项目的旧代码,并使用 Map 的 Map 的 Map 获得了如下数据结构(3 层 map ): // data structure Map>>> tagTree
这可能是一种不好的做法,但我还没有找到更好的解决方案来解决我的问题。所以我有这张 map // Map>> private Map>> properties; 我想初始化它,这样我就不会得到 Null
我们在 JDK 1.7 中使用 HashMap,我在使用 SonarQube 进行代码审查时遇到了一些问题。 请考虑以下示例: public class SerializationTest imple
我是一名优秀的程序员,十分优秀!