invCoordPolygonOrPolyline.mjs

import map from 'lodash-es/map.js'
import isearr from 'wsemi/src/isearr.mjs'
import getPointDepth from './getPointDepth.mjs'


/**
 * 針對Polygon進行(x,y)座標交換,主要因為turf的point是先經再緯,於GeoJSON也是,但跟leaflet相反,故需交換座標
 *
 * Unit Test: {@link https://github.com/yuda-lyu/w-gis/blob/master/test/invCoordPolygonOrPolyline.test.mjs Github}
 * @memberOf w-gis
 * @param {Array} pgs 輸入Polygon資料陣列,為[ [[x11,y11],[x12,y12],...], [[x21,y21],[x22,y22],...] ]構成之陣列
 * @returns {Array} 回傳Polygon陣列
 * @example
 *
 * let pgs
 * let r
 *
 * try {
 *     pgs = [[[ //multiPolygon
 *         [0.1, 0],
 *         [5.2, 1],
 *         [3.7, 2],
 *         [0.6, 3],
 *     ]]]
 *     r = invCoordPolygonOrPolyline(pgs)
 * }
 * catch (err) {
 *     r = err.message
 * }
 * console.log(JSON.stringify(r))
 * // => "invalid point depth[3]!=2"
 *
 * pgs = [[ //polygon
 *     [0.1, 0],
 *     [5.2, 1],
 *     [3.7, 2],
 *     [0.6, 3],
 * ]]
 * r = invCoordPolygonOrPolyline(pgs)
 * console.log(JSON.stringify(r))
 * // => [[[0,0.1],[1,5.2],[2,3.7],[3,0.6]]]
 *
 * try {
 *     pgs = [ //ringString
 *         [0.1, 0],
 *         [5.2, 1],
 *         [3.7, 2],
 *         [0.6, 3],
 *     ]
 *     r = invCoordPolygonOrPolyline(pgs)
 * }
 * catch (err) {
 *     r = err.message
 * }
 * console.log(JSON.stringify(r))
 * // => "invalid point depth[1]!=2"
 *
 */
function invCoordPolygonOrPolyline(pg) {
    //因為turf的point是先經再緯, GeoJSON也是, 但跟leaflet相反, 故需相反座標

    //check
    if (!isearr(pg)) {
        throw new Error(`no pg`)
    }

    //d
    let d = getPointDepth(pg)
    // console.log('getPointDepth', d)

    //check
    if (d !== 2) {
        throw new Error(`invalid point depth[${d}]!=2`)
    }

    //交換順序
    let r = map(pg, (v) => {
        return map(v, (vv) => {
            return [vv[1], vv[0]] //一定需為長度2陣列之數據
        })
    })

    return r
}


export default invCoordPolygonOrPolyline