我使用API访问使用kobotoolbox收集的空间数据。api以geoshape/geotrace/geopoint的形式返回空间数据,但我需要将这些数据隐藏到Geojson,以便我可以使用传单在地图上显示这些数据。
下面是地理here '-6.725577650887138 39.10606026649475 0.0 0.0;-6.72631550943841 39.10506717860699 0.0 0.0;-6.727484560110362 39.10561669617891 0.0 0.0;-6.727484560110362 39.10561669617891 0.0 0.0;-6.725577650887138 39.10606026649475 0.0 0.0;'的示例字符串
提前谢谢!
发布于 2021-04-14 16:04:01
这个“地space”看起来不像任何众所周知的矢量数据格式,而是像一个;-separated 4元素向量的字符串,这些向量反过来又是空格分隔的数字。
有些幼稚的解析是恰当的。
从将字符串拆分为字符串String.prototype.split()数组开始
let geoshape = '-6.725577650887138 39.10606026649475 0.0 0.0;-6.72631550943841 39.10506717860699 0.0 0.0;-6.727484560110362 39.10561669617891 0.0 0.0;-6.727484560110362 39.10561669617891 0.0 0.0;-6.725577650887138 39.10606026649475 0.0 0.0;';
let points = geoshape.split(';');现在,points是一个Array of Strings。通过提供一个按空格拆分的函数,我们可以将每个字符串转换为Array of Numbers:
function spaceSeparatedStringToArray(str) {
return str.split(' ');
}...and另一个函数,该函数将包含数字文本表示形式的String强制转换为Number,如.
function stringToNumber(str) {
return Number(str);
}现在让我们使用...and和一些方法链魔术来创建一个函数,其中输入是空格分隔的字符串,输出是Array of Numbers:
function stringToNumber(str) { return Number(str); }
function spaceSeparatedStringToArrayOfNumbers(str) {
return str.split(' ').map(stringToNumber);
}有时,最好将传递给map() (或reduce()或filter()等)的辅助函数定义为匿名lambda函数,例如:
function spaceSeparatedStringToArrayOfNumbers(str) {
return str.split(' ').map(function(str){ return Number(str) });
}如果需要,可以使用箭头函数语法:
function spaceSeparatedStringToArrayOfNumbers(str) {
return str.split(' ').map(str=>Number(str) );
}因为我们使用的是作为一种功能,所以我们可以直接使用它作为map()的参数
function spaceSeparatedStringToArrayOfNumbers(str) {
return str.split(' ').map(Number);
}现在我们有了这个函数,让我们回到开头,并将该函数应用于每个;-separated子字符串:
function spaceSeparatedStringToArrayOfNumbers(str) {
return str.split(' ').map(Number);
}
let geoshape = '-6.725577650887138 39.10606026649475 0.0 0.0;-6.72631550943841 39.10506717860699 0.0 0.0;-6.727484560110362 39.10561669617891 0.0 0.0;-6.727484560110362 39.10561669617891 0.0 0.0;-6.725577650887138 39.10606026649475 0.0 0.0;';
let points = geoshape.split(';');
let vectors = points.map(spaceSeparatedStringToArrayOfNumbers);让我们修改它,添加更多的lambda和方法链接和箭头语法:
let vectors = geoshape.split(';').map((str)=>str.split(' ').map(Number));另外,由于GeoJSON格式要求每个坐标都是一个2分量向量,而不是4分量向量,所以让我们再次使用map每个向量来保留前两个分量。这使用阵列破坏
let vectors = geoshape
.split(';')
.map((str)=>str.split(' ').map(Number))
.map(([x,y,w,z])=>[x,y]);看见?我定义了一个lambda函数,它接受一个参数,假设它是一个长度为4的数组,分解数组,然后返回一个包含前两个元素的新数组。它的工作方式还包括:
let coords = geoshape
.split(';')
.map((str)=>str.split(' ').map(Number))
.map(([x,y])=>[x,y]);您的示例数据以一个;结尾,这将导致一个空字符串,所以我也将过滤它:
let coords = geoshape
.split(';')
.filter(str=> str!=='')
.map((str)=>str.split(' ').map(Number))
.map(([x,y])=>[x,y]);我假设你在达累斯萨拉姆工作,而不是在巴达霍兹工作,所以让我们用x和y在([x,y])=>[y,x]上交换纬度和经度(也见y)。
let coords = geoshape
.split(';')
.filter(str=> str!=='')
.map((str)=>str.split(' ').map(Number))
.map(([x,y])=>[y,x]);现在转到geojson.org并阅读RFC 7946,了解如何指定GeoJSON数据结构。我们已经有了LineString几何的坐标,所以它所需要的只是一些包装:
let geojsonFeature = {
"type": "Feature",
"properties": {},
"geometry": {
"type": "LineString",
"coordinates": coords
}
};如果示例数据集意味着是一个具有外部外壳且没有内部外壳的多边形(请阅读OGC SFA以了解" hull“在此上下文中的含义),那么您可以将坐标封装在一个额外的内联数组中,并将Polygon指定为几何类型:
let geojsonFeature = {
"type": "Feature",
"properties": {},
"geometry": {
"type": "Polygon",
"coordinates": [ coords ]
}
};现在你可以把它喂给L.geoJson了。
let line = L.geoJson(geojsonFeature).addTo(map);最后,我要把所有的东西都压缩在一起,就是为了它:
let geoshape = '-6.725577650887138 39.10606026649475 0.0 0.0;-6.72631550943841 39.10506717860699 0.0 0.0;-6.727484560110362 39.10561669617891 0.0 0.0;-6.727484560110362 39.10561669617891 0.0 0.0;-6.725577650887138 39.10606026649475 0.0 0.0;';
let leafletLine = L.geoJson({
"type": "Feature",
"properties": {},
"geometry": {
"type": "LineString",
"coordinates": geoshape
.split(';')
.filter(str=> str!=='')
.map((str)=>str.split(' ').map(Number))
.map(([x,y])=>[y,x])
}
}).addTo(map);看一个这里的工作示例。,,请不要盲目地复制粘贴代码.请阅读链接的文档和资源,并了解正在发生的事情。
https://stackoverflow.com/questions/67093514
复制相似问题