d3.js 地图上的鱼眼失真
d3.js fisheye distortion on map
我正在尝试使用 fisheye.js 插件 (https://github.com/d3/d3-plugins/tree/master/fisheye) 扭曲 d3.geo.path() 地图。
要扭曲对象,插件需要 x 和 y 属性。
在 d3.js wiki 中它说:
A projection function takes a two-element array of numbers representing the coordinates of a location, [longitude, latitude], and returns a similar two-element array of numbers representing the projected pixel position [x, y]. For example, a rudimentary spherical Mercator projection:
https://github.com/mbostock/d3/wiki/Geo-Paths
所以失真应该是可能的,我只是无法理解它。
我正在使用世界-50m.json 进行投影。一旦加载,就会有一个 arcs 数组。我认为这些是我需要操纵的坐标。但这是猜测...
谢谢,
金
我发现您的 post 正在寻找答案,但互联网上似乎没有。但是,就像你说的,这是可能的!
根据 fisheye.js (https://github.com/d3/d3-plugins/tree/master/fisheye) 的文档,在 mousemove 回调中,您需要在坐标上使用鱼眼。
由于 fisheye 使用 .x
和 .y
属性,我修改了 fisheye 代码以仅使用两对 [x,y]
以避免每次在回调中都创建中间数据结构.
那你可以这样做:
canvas.on("mousemove", function() {
// console.log("mouse:");
// console.log(d3.mouse(this));
var here = d3.mouse(this);
// console.log(here); // [1030, 125]
// console.log(projection.invert(here)); // [-72.4713375653601, 45.14035261565636]
var inverted = projection.invert([here[0],here[1]]); // [-72.4713375653601, 45.14035261565636]
// console.log(inverted); // [-72.4713375653601, 45.14035261565636]
// burlington is lat 44, lon -73
fisheye.focus(inverted);
// of course, the path function takes [longitude, latitude], so -72, 44 for burlington
// https://github.com/mbostock/d3/wiki/Geo-Paths
// (so that's what it gives back)
states.attr("d",null)
.attr("d", function(d) {
// console.log("original:");
// console.log(d.geometry);
if (d.geometry.type === "Polygon") {
var b = d.geometry.coordinates.map(function(d) { return d.map(function(f) { return fisheye(f);}); });
}
else {
var b = d.geometry.coordinates.map(function(d) { return d.map(function(f) { return f.map(function(g) { return fisheye(g); }); }); });
}
// console.log(b);
var c = {type: d.geometry.type, coordinates: b};
// console.log("new:");
// console.log(c);
return path(c);
});
您可以在此处查看实时版本:http://panometer.org/instruments/teletherms/?window=25&var=maxT&year=1914&city=BURLINGTON%20WSO%20AP,%20VT
我正在尝试使用 fisheye.js 插件 (https://github.com/d3/d3-plugins/tree/master/fisheye) 扭曲 d3.geo.path() 地图。
要扭曲对象,插件需要 x 和 y 属性。
在 d3.js wiki 中它说:
A projection function takes a two-element array of numbers representing the coordinates of a location, [longitude, latitude], and returns a similar two-element array of numbers representing the projected pixel position [x, y]. For example, a rudimentary spherical Mercator projection:
https://github.com/mbostock/d3/wiki/Geo-Paths
所以失真应该是可能的,我只是无法理解它。
我正在使用世界-50m.json 进行投影。一旦加载,就会有一个 arcs 数组。我认为这些是我需要操纵的坐标。但这是猜测...
谢谢,
金
我发现您的 post 正在寻找答案,但互联网上似乎没有。但是,就像你说的,这是可能的!
根据 fisheye.js (https://github.com/d3/d3-plugins/tree/master/fisheye) 的文档,在 mousemove 回调中,您需要在坐标上使用鱼眼。
由于 fisheye 使用 .x
和 .y
属性,我修改了 fisheye 代码以仅使用两对 [x,y]
以避免每次在回调中都创建中间数据结构.
那你可以这样做:
canvas.on("mousemove", function() {
// console.log("mouse:");
// console.log(d3.mouse(this));
var here = d3.mouse(this);
// console.log(here); // [1030, 125]
// console.log(projection.invert(here)); // [-72.4713375653601, 45.14035261565636]
var inverted = projection.invert([here[0],here[1]]); // [-72.4713375653601, 45.14035261565636]
// console.log(inverted); // [-72.4713375653601, 45.14035261565636]
// burlington is lat 44, lon -73
fisheye.focus(inverted);
// of course, the path function takes [longitude, latitude], so -72, 44 for burlington
// https://github.com/mbostock/d3/wiki/Geo-Paths
// (so that's what it gives back)
states.attr("d",null)
.attr("d", function(d) {
// console.log("original:");
// console.log(d.geometry);
if (d.geometry.type === "Polygon") {
var b = d.geometry.coordinates.map(function(d) { return d.map(function(f) { return fisheye(f);}); });
}
else {
var b = d.geometry.coordinates.map(function(d) { return d.map(function(f) { return f.map(function(g) { return fisheye(g); }); }); });
}
// console.log(b);
var c = {type: d.geometry.type, coordinates: b};
// console.log("new:");
// console.log(c);
return path(c);
});
您可以在此处查看实时版本:http://panometer.org/instruments/teletherms/?window=25&var=maxT&year=1914&city=BURLINGTON%20WSO%20AP,%20VT