天天看點

WKT轉GeoJson(js版)

先來個Polygon(包括MultiPolygon)轉GeoJson的,最近有點忙,等有空加上其他的:

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 + , polygonString.length - ); //   ((),(),()) , ((),(),()) , ((),(),())
            // console.log(str);

            var pArray = new Array();
            var polygonArray = str.split(")),((");
            for (var i = ; i < polygonArray.length; i++) {
                var pStr = polygonArray[i];//每個polygon的String
                if (polygonArray.length === ) {//如果隻有1個,說明沒有被分割
                    // 去掉第一個(  去掉結尾)
                    pStr = pStr.substring(, pStr.length - );
                } else if (i === ) {
                    // 第一個,去第一個(   補結尾加上 )
                    pStr = pStr.substring(, pStr.length) + ")"; //  (),(),()   環的集合
                }
                else if (i === polygonArray.length - ) {
                    // 最後一個: 補第一個( , 去 最後一個)
                    pStr = "(" + pStr.substring(, pStr.length - );
                } else {
                    // 中間,補第一個(   補最後一個 )
                    pStr = "(" + pStr + ")";
                }

                // pStr 表示  () , () ,()   線環集合

                // 分割環
                var rArray = new Array();
                var ringsArray = pStr.split("),(");
                for (var j = ; j < ringsArray.length; j++) {
                    var ringStr = ringsArray[j];

                    if (ringsArray.length === ) {
                        // 去掉第一個(   去掉結尾  )
                        ringStr = ringStr.substring(, ringStr.length - );
                    } else if (j === ) {                    // 如果是第一個
                        // 去掉第一個(
                        ringStr = ringStr.substring(, ringStr.length);
                    } else if (j === ringsArray.length - ) {// 最後一個 
                        // 去掉結尾 )
                        ringStr = ringStr.substring(, ringStr.length - );
                    }

                    // 再按逗号分割就是點集合
                    var ptsArray = new Array();
                    var pointArr = ringStr.split(",");
                    for (var k = ; k < pointArr.length; k++) {
                        var pt_arr = pointArr[k].split(" ");
                        var proj_arr = proj4(proj).inverse([pt_arr[], pt_arr[]]);

                        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 + , polygonString.length - ); //   (),(),() 

            var rArray = new Array();
            var ringsArray = str.split("),(");
            for (var j = ; j < ringsArray.length; j++) {
                var ringStr = ringsArray[j];

                if (ringsArray.length === ) {
                    // 去掉第一個(   去掉結尾  )
                    ringStr = ringStr.substring(, ringStr.length - );
                } else if (j === ) {                    // 如果是第一個
                    // 去掉第一個(
                    ringStr = ringStr.substring(, ringStr.length);
                } else if (j === ringsArray.length - ) {// 最後一個 
                    // 去掉結尾 )
                    ringStr = ringStr.substring(, ringStr.length - );
                }

                // 再按逗号分割就是點集合
                var ptsArray = new Array();
                var pointArr = ringStr.split(",");
                for (var k = ; k < pointArr.length; k++) {
                    var pt_arr = pointArr[k].split(" ");
                    var proj_arr = proj4(proj).inverse([pt_arr[], pt_arr[]]);

                    ptsArray.push(proj_arr);
                }

                rArray.push(ptsArray);
            }

            geoJson["coordinates"] = rArray;
        }
        return geoJson;
    }
           

參考資料:

http://www.oschina.net/translate/geojson-spec#coordinate-reference-system-objects

http://blog.csdn.net/arenn/article/details/54907545

http://www.cnblogs.com/marsprj/archive/2013/02/08/2909452.html