我使用D3来显示县内的客户位置。对于我的大多数县,我没有任何问题。我使用以下代码片段来获取我的县的XY坐标
var countyCoords = county.geometry.coordinates[0];
...
for (var j = 0; j < countyCoords.length; j++)
{
var x = projection(countyCoords[j])[0];
var y = projection(countyCoords[j])[1];
像魅力一样,有一个例外。如果我的county.geometry [“type”]是MultiPolygon,则这些行会失败。如何在d3中获取MultiPolygon的屏幕位置(即x,y)?
以下是我输入到d3.json()[编辑此处显示]
的一些行"counties":
{
"type":"GeometryCollection",
"geometries":[
{"type":"MultiPolygon","properties":{"NAME":"Chester"},"id":"Chester","arcs":[[[13,2111,15,2112,17,18,2113,2114,20,2115,2116,-1951,2117,2118,2119,9,2120,11,2121]],[[2122,2123]]]},
{"type":"Polygon","properties":{"NAME":"Clarion"},"id":"Clarion","arcs":[[-1966,2124,-2004,-2018,-2063]]},
我通过使用这条线获得了县:
counties = topojson.feature(topoData, topoData.objects.counties);
我遍历县并收集上面提到的XY位置,如下所示:
for (var i = 0; i < counties.features.length; i++)
{
var county = counties.features[i];
var countyCoords = county.geometry.coordinates[0];
var xy = [];
for (var j = 0; j < countyCoords.length; j++)
{
var x = projection(countyCoords[j])[0];
var y = projection(countyCoords[j])[1];
var dataPoint = [x,y];
xy.push(dataPoint);
}
county.properties["XY"] = xy;
}
这对于“Clarion”县来说是正确的,但是对于“切斯特”县来说却失败了。
答案 0 :(得分:1)
GeoJSON multipolygon对其结构有一个额外的数组级别,您需要迭代:
http://geojson.org/geojson-spec.html
为了解决这个问题,你必须做这样的事情:
if (county.geometry.type == "MultiPolygon") {
for (var x=0; x< countyCoords.length;x++) {
for (var j = 0; j < countyCoords[x].length; j++) {
var x = projection(countyCoords[x][j])[0];
var y = projection(countyCoords[x][j])[1];
答案 1 :(得分:0)
这是解决我的问题的代码。这几乎是以利亚的建议,但根据我的具体需求量身定制。 (注意:这仅适用于Multipolygon类型,普通多边形类型应使用我原始帖子中标识的代码)。另外,请随时指出我的代码可以改进的地方。
for (var i = 0; i < counties.features.length; i++)
{
var county = counties.features[i];
if (county.geometry["type"] === "MultiPolygon")
{
var xy = [];
for (var k = 0; k < county.geometry.coordinates.length; k++)
{
var countyCoords = county.geometry.coordinates[k][0];
for (var j = 0; j < countyCoords.length; j++)
{
var x = projection(countyCoords[j])[0];
var y = projection(countyCoords[j])[1];
var dataPoint = [x,y];
xy.push(dataPoint);
}
county.properties["XY"] = xy;
}
}
}