无法将topojson对象作为openlayers层加载

无法将topojson对象作为openlayers层加载,openlayers,topojson,Openlayers,Topojson,我使用的是开放层,无法直接从topojson对象(而不是URL)加载地图层 地图应该有一个代表墨西哥的蓝色矢量层,但由于某些原因,该层没有添加到地图中。它没有抛出任何错误。我不认为这是一个预测问题 我已经在开放层之外加载了topojson对象,所以我想直接使用它,而不是从URL重新加载 //创建背景层 var raster=新建ol.layer.Tile({ 来源:new ol.source.TileJSON({ 网址:'https://api.tiles.mapbox.com/v3/mapb

我使用的是开放层,无法直接从topojson对象(而不是URL)加载地图层

地图应该有一个代表墨西哥的蓝色矢量层,但由于某些原因,该层没有添加到地图中。它没有抛出任何错误。我不认为这是一个预测问题

我已经在开放层之外加载了topojson对象,所以我想直接使用它,而不是从URL重新加载

//创建背景层
var raster=新建ol.layer.Tile({
来源:new ol.source.TileJSON({
网址:'https://api.tiles.mapbox.com/v3/mapbox.world-dark.json?secure'
})
});
//使用topojson URL作为输入为美国创建向量层
var style\u world\u RedBorder=新ol.style.style({
填充:新的ol.style.fill({
颜色:“rgba(0,0,0,0)”
}),
笔划:新的ol风格笔划({
颜色:“rgba(255,0,0,1)”,
宽度:1
})
});
var vector_world=新ol.layer.vector({
来源:新ol.source.Vector({
网址:'https://openlayers.org/en/v4.6.5/examples/data/topojson/world-110m.json',
格式:新的ol.format.TopoJSON({
图层:[“国家”]
}),
重叠:错误
}),
样式:样式\u世界\u红色边框
});
//使用topojson对象作为输入为墨西哥创建向量层
var style_mexico=新ol.style.style({
填充:新的ol.style.fill({
颜色:“rgba(0255,0,0.25)”
}),
笔划:新的ol风格笔划({
颜色:“rgba(0255,0,1)”,
宽度:1
})
});
墨西哥变种={
“类型”:“拓扑结构”,
“弧”:[
[
[315, 1244],
[121, -48],
[171, 0],
[110, 31],
[90, -87],
[21, -67],
[84, -52],
[29, 57],
[76, 2],
[115, -164],
[24, -84],
[118, -38],
[-33, -124],
[-5, -160],
[41, -115],
[77, -136],
[82, -44],
[182, 52],
[42, 39],
[23, 122],
[142, 44],
[70, -13],
[-54, -137],
[-2, -87],
[-83, -45],
[-111, 0],
[32, -129],
[-77, 0],
[-29, -61],
[-59, 16],
[-101, 71],
[-97, -59],
[-194, 80],
[-228, 121],
[-93, 77],
[-39, 78],
[29, 76],
[-38, 91],
[-159, 194],
[-48, 93],
[-65, 50],
[-110, 133],
[-108, 200],
[-53, -6],
[11, -103],
[108, -131],
[132, -270],
[-91, 6],
[-11, 99],
[-127, 75],
[25, 97],
[-99, 92],
[-86, 206],
[140, -2],
[105, -40]
]
],
“转变”:{
“比例”:[0.01659893222296365,0.013431657853810241],
“翻译”:[-118.289168999996,15.262220000000072]
},
“对象”:{
“墨西哥”:{
“类型”:“GeometryCollection”,
“几何学”:[{
“弧”:[
[0]
],
“类型”:“多边形”,
“财产”:{
“FIPS”:“MX”,
“ISO2”:“MX”,
“ISO3”:“MEX”,
“联合国”:484,
“名称”:“墨西哥”,
“区域”:190869,
“POP2005”:104266392,
“区域”:19,
“次区域”:13,
“LON”:-102.535,
“LAT”:23.951
}
}]
}
}
}
var features=(新的ol.format.TopoJSON)({
图层:[“墨西哥”]
})).readFeatures(墨西哥科达);
var source=新的ol.source.Vector({
特色:特色,,
重叠:错误
});
var vector_mexico=新ol.layer.vector({
资料来源:资料来源,
风格:墨西哥风格
});
//将所有图层添加到地图
var map=新ol.map({
图层:[光栅、矢量世界、矢量墨西哥],
目标:“地图”,
视图:新ol.view({
中间:[0,0],
缩放:1
})
});

TopoJSON

当您读入功能时,您必须先告诉OL数据的投影,然后告诉OL您在其中显示功能的投影。因此,在代码的这一部分:

var features = (new ol.format.TopoJSON({
  layers: ['mexico']
})).readFeatures(mexicoData);
您需要添加以下内容:

var features = (new ol.format.TopoJSON({
  layers: ['mexico']
})).readFeatures(mexicoData,{
  dataProjection: 'EPSG:4326',
  featureProjection: 'EPSG:3857'
});

我复制了你的源代码,并尝试了这个,它的工作如预期。顺便说一句,没有这个修改,你的多边形会打印,但它在EPSG:3857 0,0坐标处非常小,你可以在那里看到一个蓝色的小“点”。如果你放大很多,你会看到墨西哥的轮廓。

谢谢。这很有效。有趣的是,当前没有提到第二个参数。是的,这是一个遗漏,因为其他JSON格式在文档中列出了这些参数。但我记得在使用ol.format.GeoJSON时必须指定数据和特性投影。另外,当我看到0,0处的蓝色“点”时,我意识到这可能就是问题所在。