1.首先把字符串数据转成三维数组
LineString这个也可以是数组包含多个面信息
也支持一个对象里面有多条河流信息
下面是我写的一个方法(json里面字段未必和我一样,可以修改一下就好)
let json=require('./河流.json')
function clearObj(objList){
for(var i in objList){
if( typeof objList[i] =='number'){
objList[i]=0
}else if(Array.isArray( objList[i]) ){
objList[i]=[]
}
}
return objList
}
Object.prototype.clearObj=clearObj
var objList ={
list1:[],
list2:[],
arryList:[],
arry :[],
lineArry:[],
num:0,
i:0
}
json.map(jsonItem=>{
objList=Object.clearObj.apply(Object,[objList])
if(jsonItem.name){
jsonItem.name.map(nameItem=>{
objList= Object.clearObj.apply(Object,[objList])
console.log(objList,'222')
nameItem.threeArray=getThreeArrayData.call(objList,nameItem)
})
}else{
jsonItem.threeArray= getThreeArrayData.call(objList,jsonItem)
}
})
function getThreeArrayData(jsonItem){
if(Array.isArray(jsonItem.LineString)){
jsonItem.LineString.map(lineItem=>{
lineItem= lineItem.split('",')||lineItem.split("',")
this.arryList.push(lineItem[0])
})
}else{
this.arryList= jsonItem.LineString.split('",')||jsonItem.LineString.split("',")
}
this.arryList.map(arrItem=>{
this.arry = arrItem.replace(' ', '').split(',0').join()
this.arry=this.arry.slice(0, this.arry.length - 1).split(',')
this.arry.map((item, index) => {
item = Number(item);
if (index % 2 == 0) {
this.num = this.i;
this.list1[this.i] = []
this.list1[this.i].push(item)
this.i++
} else {
this.list1[this.num].push(item)
}
})
this.list2.push(this.list1)
})
return this.list2
}
这个时候就能拿到json数据里面有个threeArray这个字段就是三维数组
2.将三维数组进行转换至polygon
function ringsToStr(list) {
list = JSON.parse(JSON.stringify(list));
var str = '';
if (list.length > 1) {
str = multiRingsToStr(list);//多维2重数组,就是有多个面的处理
} else if (list.length == 1) {
str = ringsToStr(list[0]);//只有一个面的数据
};
function ringsToStr(rings) {
var s = 'POLYGON((';
for (var i = 0; i < rings.length; i++) {
s += rings[i][0] + ' ' + rings[i][1];
if (i < rings.length - 1) {
s += ','
} else {
s += '))';
};
};
return s;
};
function multiRingsToStr(rings) {
var s = 'MULTIPOLYGON(';
for (var j = 0; j < rings.length; j++) {
var data = rings[j]; //rings[j][0];
s += '((';
for (var i = 0; i < data.length; i++) {
s += data[i][0] + ' ' + data[i][1];
if (i < data.length - 1) {
s += ','
} else {
s += '))';
};
};
if (j < rings.length - 1) {
s += ',';
} else {
s += ')';
};
};
return s;
};
return str
}
json.map(item=>{
if(item.name){
item.name.map(nameItem=>{
nameItem.polygon=ringsToStr(nameItem.threeArray)
})
}else{
item.polygon=ringsToStr(item.threeArray)
}
})
最后返回的json里面就会有polygon字段,arcgis就可以使用了
3.面转三维数组
strToRings(str) {
var list = [];
if (str.indexOf('MULTIPOLYGON') > -1) {
list = multiPolygon(str);
} else if (str.indexOf('POLYGON') > -1) {
list = singlePolgon(str);
};
function singlePolgon(d) {
var res = [];
var d1 = d.replace('POLYGON', '').replace("((", '');
var d2 = d1.replace("))", '');
var d3 = d2.split(",")
for (var i = 0; i < d3.length; i++) {
var a = d3[i].trim().split(" ");
res.push([parseFloat(a[0]), parseFloat(a[1])]);
}
return [res]
};
function multiPolygon(d) {
var res = []
var d1 = d.replace('MULTIPOLYGON', '').replace('(', '');
var d2 = d1.replace(')))', '))')
var d3 = d2.split(")),");
d3.map(function(item) {
item = item.replace("((", '');
var d4 = item.split(",");
var d5 = []
for (var i = 0; i < d4.length; i++) {
var a = d4[i].trim().split(" ");
d5.push([parseFloat(a[0]), parseFloat(a[1])]);
};
res.push(d5);
});
return res;
};
return list;
}
4.dataV MultiPolygon类型:数组转字符串
ringsToStr(content[0])//上面方法