在 JSON 数组的 D3 中显示坐标
Displaying coordinates in D3 from JSON array
我从 php 得到一个 json 响应坐标,如下所示
{"All":[{"longitude":"36.8948669","name":" Manyanja Rd, Nairobi, Kenya","latitude":"-1.2890965","userID":"1"}, ...]}
我之后通过 javascript 加载它如下:
$.ajax({
url : "http://xxx.xxx.xxx/GetLocations.php",
dataType : "json",
data :"",
success :
function (data){
//populate map is the function that I pass the coordinates to d3 to be shown
//when i console.log(data), its showing me the json so I am sure the data is there
populate_map(data)
}
});
这是函数 populate_map。
function populate_map(pos_data){
console.log(pos_data.All[0]);
var width = 700;
var height = 580;
var svg = d3.select( "body" )
.append( "svg" )
.attr( "width", width )
.attr( "height", height );
var g = svg.append( "g" );
var albersProjection = d3.geo.albers()
.scale( 190000 )
.rotate( [71.057,0] )
.center( [0, 42.313] )
.translate( [width/2,height/2] );
var geoPath = d3.geo.path()
.projection( albersProjection );
var projection = d3.geo.mercator()
.center([36.8, -1.3])
.scale([60000])
.translate([width/2, height/2]);
var nairobipathing = d3.geo.path().projection(projection);
g.selectAll( "path" )
.data( data.geometries )
.enter()
.append( "path" )
.attr( "fill", "#ccc" )
.attr( "stroke", "#333")
.attr( "d", nairobipathing );
svg.selectAll("circles.points")
.data(pos_data)
.enter()
.append("circle")
.attr("r",5)
.attr("transform", function(d) {return "translate(" d.All.longitude+","+d.All.latitude ")";});
}
问题是它没有显示我初始化的内罗毕地图上的任何坐标,但是当我 console.log 填充函数中的数据时它显示了数据 json。
最后一个 svg 是我用来用这些坐标填充地图的 svg,但它不起作用,也没有在地图中显示任何坐标。
请帮我看看问题出在哪里
首先,您似乎使用了两个投影,如果您删除对以大西洋北美海岸为中心的阿尔伯斯投影的引用,将会更清楚。
其次,您应该传递所呈现的数据对象中的点数组,而不是数据对象本身。
第三,转换中使用的值需要在 svg 坐标 space 而不是地理坐标 space 中。在您的示例中,您使用 d.All.longitude 或 d.All.latitude 而不应用投影。您需要使用 projection([longitude,latitude]) 来获取圆的 svg 坐标。这 returns svg 坐标 space 中的坐标 [x,y] (如果需要,您可以分别提取 x 和 y 坐标。
根据第二点和第三点,您的点可以附加如下内容:
svg.selectAll(".points")
.data(pos_data.All)
.enter()
.append("circle")
.attr("class","points")
.attr("r", 5 )
.attr("stroke","orange")
.attr("transform", function(d) {return "translate(" + projection([d.longitude,d.latitude]) + ")";})
或者,您可以使用 .attr("cx",x) 或 .attr("cy",y) 作为点中心而不是平移:
svg.selectAll(".points")
.data(test.All)
.enter()
.append("circle")
.attr("class","points")
.attr("r", 5 )
.attr("stroke","orange")
.attr("cx", function(d) { return projection([d.longitude,d.latitude])[0]; })
.attr("cy", function(d) { return projection([d.longitude,d.latitude])[1]; })
我从 php 得到一个 json 响应坐标,如下所示
{"All":[{"longitude":"36.8948669","name":" Manyanja Rd, Nairobi, Kenya","latitude":"-1.2890965","userID":"1"}, ...]}
我之后通过 javascript 加载它如下:
$.ajax({
url : "http://xxx.xxx.xxx/GetLocations.php",
dataType : "json",
data :"",
success :
function (data){
//populate map is the function that I pass the coordinates to d3 to be shown
//when i console.log(data), its showing me the json so I am sure the data is there
populate_map(data)
}
});
这是函数 populate_map。
function populate_map(pos_data){
console.log(pos_data.All[0]);
var width = 700;
var height = 580;
var svg = d3.select( "body" )
.append( "svg" )
.attr( "width", width )
.attr( "height", height );
var g = svg.append( "g" );
var albersProjection = d3.geo.albers()
.scale( 190000 )
.rotate( [71.057,0] )
.center( [0, 42.313] )
.translate( [width/2,height/2] );
var geoPath = d3.geo.path()
.projection( albersProjection );
var projection = d3.geo.mercator()
.center([36.8, -1.3])
.scale([60000])
.translate([width/2, height/2]);
var nairobipathing = d3.geo.path().projection(projection);
g.selectAll( "path" )
.data( data.geometries )
.enter()
.append( "path" )
.attr( "fill", "#ccc" )
.attr( "stroke", "#333")
.attr( "d", nairobipathing );
svg.selectAll("circles.points")
.data(pos_data)
.enter()
.append("circle")
.attr("r",5)
.attr("transform", function(d) {return "translate(" d.All.longitude+","+d.All.latitude ")";});
}
问题是它没有显示我初始化的内罗毕地图上的任何坐标,但是当我 console.log 填充函数中的数据时它显示了数据 json。
最后一个 svg 是我用来用这些坐标填充地图的 svg,但它不起作用,也没有在地图中显示任何坐标。
请帮我看看问题出在哪里
首先,您似乎使用了两个投影,如果您删除对以大西洋北美海岸为中心的阿尔伯斯投影的引用,将会更清楚。
其次,您应该传递所呈现的数据对象中的点数组,而不是数据对象本身。
第三,转换中使用的值需要在 svg 坐标 space 而不是地理坐标 space 中。在您的示例中,您使用 d.All.longitude 或 d.All.latitude 而不应用投影。您需要使用 projection([longitude,latitude]) 来获取圆的 svg 坐标。这 returns svg 坐标 space 中的坐标 [x,y] (如果需要,您可以分别提取 x 和 y 坐标。
根据第二点和第三点,您的点可以附加如下内容:
svg.selectAll(".points")
.data(pos_data.All)
.enter()
.append("circle")
.attr("class","points")
.attr("r", 5 )
.attr("stroke","orange")
.attr("transform", function(d) {return "translate(" + projection([d.longitude,d.latitude]) + ")";})
或者,您可以使用 .attr("cx",x) 或 .attr("cy",y) 作为点中心而不是平移:
svg.selectAll(".points")
.data(test.All)
.enter()
.append("circle")
.attr("class","points")
.attr("r", 5 )
.attr("stroke","orange")
.attr("cx", function(d) { return projection([d.longitude,d.latitude])[0]; })
.attr("cy", function(d) { return projection([d.longitude,d.latitude])[1]; })