首先明确一点,WKT与WKB是OGC中的简单服务标准SFS(Simple Features Interface Standard),但是GeoJSON并不是OGC中的标准。
WKT(Well-known text)是开放地理空间联盟OGC(Open GIS Consortium )制定的一种文本标记语言,用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换。
WKB(well-known binary) 是WKT的二进制表示形式,解决了WKT表达方式冗余的问题,便于传输和在数据库中存储相同的信息。
GeoJSON 一种JSON格式的Feature信息输出格式,它便于被JavaScript等脚本语言处理,OpenLayers等地理库便是采用GeoJSON格式。此外,TopoJSON等更精简的扩展格式。
WKT与geojson分为点、线、面、几何集合四种:
1、Point, MultiPoint
2、LineString, MultiLineString
3、Polygon, MultiPolygon
4、GeometryCollection
可以由多种Geometry组成,如:GEOMETRYCOLLECTION(POINT(4 6),LINESTRING(4 6,7 10))
WKT与geojson的主要区别是wkt是单独用来表示空间点线面数据的,而geojson还可以用来表示空间数据和属性数据的集合,下面是shp面数据转geojson,其中还包含图层信息等,而wkt并不能表示这个。
WKB是采用二进制存储表示点线面等。
wkt简介
WKT(Well-known text)是一种文本标记语言,用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换。它的二进制表示方式,亦即WKB(well-known-binary)则胜于在传输和在数据库中存储相同的信息。该格式由开放地理空间联盟(OGC)制定。WKT可以表示的几何对象包括:点,线,多边形,TIN(不规则三角网)及多面体。以下为几何WKT字串样例:
POINT(6 10)
LINESTRING(3 4,10 50,20 25)
POLYGON((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2))
MULTIPOINT(3.5 5.6, 4.8 10.5)
MULTILINESTRING((3 4,10 50,20 25),(-5 -8,-10 -8,-15 -4))
MULTIPOLYGON(((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2)),((6 3,9 2,9 4,6 3)))
GEOMETRYCOLLECTION(POINT(4 6),LINESTRING(4 6,7 10))
POINT ZM (1 1 5 60)
POINT M (1 1 80)
POINT EMPTY
MULTIPOLYGON EMPTY
WKT转GeoJson(js版)
function processPolygonString2PolygonArray(polygonString, proj) {
var geoJson = {};
if (polygonString.startsWith("MULTIPOLYGON")) {
// 多面
geoJson["type"] = "MultiPolygon";
var firstLeftIndex = polygonString.indexOf('(');
var lastRightIndex = polygonString.indexOf(')');
// 去掉首尾括号
var str = polygonString.substring(firstLeftIndex + 1, polygonString.length - 1); // ((),(),()) , ((),(),()) , ((),(),())
// console.log(str);
var pArray = new Array();
var polygonArray = str.split(")),((");
for (var i = 0; i < polygonArray.length; i++) {
var pStr = polygonArray[i];//每个polygon的String
if (polygonArray.length === 1) {//如果只有1个,说明没有被分割
// 去掉第一个( 去掉结尾)
pStr = pStr.substring(1, pStr.length - 1);
} else if (i === 0) {
// 第一个,去第一个( 补结尾加上 )
pStr = pStr.substring(1, pStr.length) + ")"; // (),(),() 环的集合
}
else if (i === polygonArray.length - 1) {
// 最后一个: 补第一个( , 去 最后一个)
pStr = "(" + pStr.substring(0, pStr.length - 1);
} else {
// 中间,补第一个( 补最后一个 )
pStr = "(" + pStr + ")";
}
// pStr 表示 () , () ,() 线环集合
// 分割环
var rArray = new Array();
var ringsArray = pStr.split("),(");
for (var j = 0; j < ringsArray.length; j++) {
var ringStr = ringsArray[j];
if (ringsArray.length === 1) {
// 去掉第一个( 去掉结尾 )
ringStr = ringStr.substring(1, ringStr.length - 1);
} else if (j === 0) { // 如果是第一个
// 去掉第一个(
ringStr = ringStr.substring(1, ringStr.length);
} else if (j === ringsArray.length - 1) {// 最后一个
// 去掉结尾 )
ringStr = ringStr.substring(0, ringStr.length - 1);
}
// 再按逗号分割就是点集合
var ptsArray = new Array();
var pointArr = ringStr.split(",");
for (var k = 0; k < pointArr.length; k++) {
var pt_arr = pointArr[k].split(" ");
var proj_arr = proj4(proj).inverse([pt_arr[0], pt_arr[1]]);
ptsArray.push(proj_arr);
}
rArray.push(ptsArray);
}
pArray.push(rArray);
}
//console.log(JSON.stringify(pArray));
geoJson["coordinates"] = pArray;
} else if (polygonString.startsWith("POLYGON")) {
// 面,其中有可能有环
geoJson["type"] = "Polygon";
var firstLeftIndex = polygonString.indexOf('(');
var lastRightIndex = polygonString.indexOf(')');
// 去掉首尾括号
var str = polygonString.substring(firstLeftIndex + 1, polygonString.length - 1); // (),(),()
var rArray = new Array();
var ringsArray = str.split("),(");
for (var j = 0; j < ringsArray.length; j++) {
var ringStr = ringsArray[j];
if (ringsArray.length === 1) {
// 去掉第一个( 去掉结尾 )
ringStr = ringStr.substring(1, ringStr.length - 1);
} else if (j === 0) { // 如果是第一个
// 去掉第一个(
ringStr = ringStr.substring(1, ringStr.length);
} else if (j === ringsArray.length - 1) {// 最后一个
// 去掉结尾 )
ringStr = ringStr.substring(0, ringStr.length - 1);
}
// 再按逗号分割就是点集合
var ptsArray = new Array();
var pointArr = ringStr.split(",");
for (var k = 0; k < pointArr.length; k++) {
var pt_arr = pointArr[k].split(" ");
var proj_arr = proj4(proj).inverse([pt_arr[0], pt_arr[1]]);
ptsArray.push(proj_arr);
}
rArray.push(ptsArray);
}
geoJson["coordinates"] = rArray;
}
return geoJson;
}
Cesium读取WKT数据绘制Polygon
function DrawTypeMPolygon(polygonFeature){
var strXY = polygonFeature.geom;
//2.(MULTIPOLYGON )16位
var arrayXYs = strXY.substring(16, strXY.length - 4);
var arrayPolygons = arrayXYs.split(")), ((");
for(var i = 0; i< arrayPolygons.length; i++)
{
//继续分割成多个polygon
var Polygons = arrayPolygons[i].split("), ("); //分割
var tempAllXYs = [];
for (var j = 0; j < Polygons.length; j++) {
var curID = map3d.cesium3Dview.entities.getById(polygonFeature.wscd + i + j);
//如果当前实体不存在则绘制
if (curID != undefined) {
return;
}
var arrayXYs = Polygons[j].split(", ");
var step = 1;
if(arrayXYs.length > 150){
step = 16;
}
for (var k = 0; k < arrayXYs.length; k+=step) {
//存储全部的XY值
var temp = arrayXYs[k].split(" ");
tempAllXYs.push(temp[0]);
tempAllXYs.push(temp[1]);
}
//转化为经纬度,进行渲染
var positions = Cesium.Cartesian3.fromDegreesArray(tempAllXYs);
//绘制上级流域面
if(polygonFeature != undefined && polygonFeature.wscd != undefined)
{
var wataPolygon = map3d.cesium3Dview.entities.add({
name: 'WATAPolygon',
id: polygonFeature.wscd + i + j,
data: polygonFeature,
show: true,
polygon: {
hierarchy: positions,
material: Cesium.Color.YELLOW.withAlpha(0.5),
}
});
wataPolygon.manualUpdate = true;
wataPolygon.forceUpdate = true;
WataPolygons.push(wataPolygon);
}
}
}
}
function DrawTypePPolygon(polygonFeature){
var strXY = polygonFeature.geom;
// 1.(POLYGON )类型解析
var arrayXYs = strXY.substring(10, strXY.length - 2);
var arrayPolygons = arrayXYs.split("), (");
for(var t = 0; t < arrayPolygons.length; t++)
{
var curID = map3d.cesium3Dview.entities.getById(polygonFeature.wscd + t);
//如果当前实体不存在则绘制
if (curID != undefined) {
continue;
}
var tempAllXYs = [];
var tempPolygon = arrayPolygons[t].split(", "); //删稠首位,分割
var step = 1;
if(tempPolygon.length > 150){
step = 16;
}
for (var j = 0; j < tempPolygon.length; j+=step) {
//存储全部的XY值
var temp = tempPolygon[j].split(" ");
tempAllXYs.push(temp[0]);
tempAllXYs.push(temp[1]);
}
var positions = Cesium.Cartesian3.fromDegreesArray(tempAllXYs);
//绘制上级流域面
if(polygonFeature != undefined && polygonFeature.wscd != undefined)
{
var wataPolygon = map3d.cesium3Dview.entities.add({
name: 'WATAPolygon',
id: polygonFeature.wscd + t,
data: polygonFeature,
show: true,
polygon: {
hierarchy: positions,
material: Cesium.Color.YELLOW.withAlpha(0.5),
}
});
wataPolygon.manualUpdate = true;
wataPolygon.forceUpdate = true;
WataPolygons.push(wataPolygon);
}
}
}
欢迎评论指正!
参考学习地址:
https://blog.csdn.net/xcymorningsun/article/details/89848096?utm_medium=distribute.wap_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.wap_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
https://blog.csdn.net/birdflyto206/article/details/77171937