GIS-WKT、WKB与GeoJSON

首先明确一点,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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haokan_Jia

你的鼓励就是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值