w-gis

w-gis

new w-gis()

Source:

Members

(static) turf

Description:
  • 取得引用turf物件

    Unit Test: Github

Source:

取得引用turf物件

Unit Test: Github

Example
let r = importTurf
console.log(r)
// => [Module: null prototype] {
//   along: [Function: along],
//   angle: [Function: angle],
//   applyFilter: [Function: applyFilter],
//   area: [Function: area],
//   ...

Methods

(static) Build() → {Object}

Description:
  • 判斷點陣列[x,y]或點物件{x,y}是否位於某一特徵(Feature)內之字典物件,若有則回傳該特徵之鍵名,若無則回傳def值

    Unit Test: Github

Source:
Example
let geojson
let p
let r

geojson = `
{
    'type': 'FeatureCollection',
    'name': 'pgs',
    'features': [
        {
            'type': 'Feature',
            'properties': {
                'name': 'pgs1',
            },
            'geometry': {
                'type': 'MultiPolygon',
                'coordinates': [
                    [
                        [
                            [0, 0],
                            [0, 1],
                            [1, 1],
                            [1, 0],
                            [0, 0],
                        ]
                    ]
                ]
            }
        },
        {
            'type': 'Feature',
            'properties': {
                'name': 'pgs2',
            },
            'geometry': {
                'type': 'MultiPolygon',
                'coordinates': [
                    [
                        [
                            [1, 1],
                            [1, 2],
                            [2, 2],
                            [2, 1],
                            [1, 1],
                        ]
                    ]
                ]
            }
        },
    ]
}
`
let BD = buildFindPointInGeojson
let bd = new BD()
await bd.init(geojson, { key: 'properties.name' })

p = [0.5, 0.5]
r = await bd.getPoint(p)
console.log(r)
// => 'pgs1'

p = [1.5, 1.5]
r = await bd.getPoint(p)
console.log(r)
// => 'pgs2'

p = [1.5, 0.5]
r = await bd.getPoint(p)
console.log(r)
// => 'unknow'

p = [1.5, 0.5]
r = await bd.getPoint(p, { def: '未知' })
console.log(r)
// => '未知'
Returns:

回傳函數物件,包含init、isInit、getPoint函數。init為初始化,輸入geojson與opt,無輸出,功能詳見getKpFeatureFromGeojson。isInit為回傳是否初始化布林值,無輸入。getPoint為查詢點位於哪個特徵並回傳該鍵名,輸入p與opt,功能詳見findPointInKpFeature。

Type
Object

(static) Build() → {Object}

Description:
  • 判斷點陣列[x,y]或點物件{x,y}是否位於某一多邊形與其邊界內之字典物件,若有則回傳該特徵之鍵名,若無則回傳def值

    Unit Test: Github

Source:
Example
let kpPgs = {
    'pgs1': [
        [0, 0],
        [0, 1],
        [1, 1],
        [1, 0],
        [0, 0],
    ],
    'pgs2': [
        [1, 1],
        [1, 2],
        [2, 2],
        [2, 1],
        [1, 1],
    ],
}
let p
let r

let BD = buildFindPointInKpBoxPolygons
let bd = new BD()
await bd.add('pgs1', kpPgs['pgs1'])
await bd.add('pgs2', kpPgs['pgs2'])

p = [0.5, 0.5]
r = await bd.getPoint(p)
console.log(r)
// => 'pgs1'

p = [1.5, 1.5]
r = await bd.getPoint(p)
console.log(r)
// => 'pgs2'

p = [1.5, 0.5]
r = await bd.getPoint(p)
console.log(r)
// => 'unknow'

p = [1.5, 0.5]
r = await bd.getPoint(p, { def: '未知' })
console.log(r)
// => '未知'
Returns:

回傳函數物件,包含add、getPoint函數。add為新增,輸入name、pgs與opt,無輸出。getPoint為查詢點位於哪個多邊形並回傳該鍵名,輸入p與opt,功能詳見findPointInKpBoxPolygons。

Type
Object

(static) Build() → {Object}

Description:
  • 判斷點陣列[x,y]或點物件{x,y}是否位於某一多邊形內之字典物件,若有則回傳該多邊形之鍵名,若無則回傳def值

    Unit Test: Github

Source:
Example
let kpPgs = {
    'pgs1': [
        [0, 0],
        [0, 1],
        [1, 1],
        [1, 0],
        [0, 0],
    ],
    'pgs2': [
        [1, 1],
        [1, 2],
        [2, 2],
        [2, 1],
        [1, 1],
    ],
}
let p
let r

let BD = buildFindPointInKpPolygons
let bd = new BD()
await bd.init(kpPgs)

p = [0.5, 0.5]
r = await bd.getPoint(p)
console.log(r)
// => 'pgs1'

p = [1.5, 1.5]
r = await bd.getPoint(p)
console.log(r)
// => 'pgs2'

p = [1.5, 0.5]
r = await bd.getPoint(p)
console.log(r)
// => 'unknow'

p = [1.5, 0.5]
r = await bd.getPoint(p, { def: '未知' })
console.log(r)
// => '未知'
Returns:

回傳函數物件,包含init、isInit、getPoint函數。init為初始化,輸入kpPgs,無輸出,isInit為回傳是否初始化布林值,無輸入。getPoint為查詢點位於哪個多邊形並回傳該鍵名,輸入p與opt,功能詳見findPointInKpPolygons。

Type
Object

(static) Build() → {Object}

Description:
  • 查詢點陣列[x,y]或點物件{x,y}於指定Tiff點陣圖內數值,若無則回傳def值

    Unit Test: Github

Source:
Example
import b642u8arr from 'wsemi/src/b642u8arr.mjs'
import buildFindPointInTiff from 'wsemi/src/buildFindPointInTiff.mjs'

let p
let r

let b64Tif = `SUkqAA4HAAAQAAABAwABAAAAFAAAAAEBAwABAAAAEgAAAAIBAwABAAAAIAAAAAMBAwABAAAAAQAAAAYBAwABAAAAAQAAABEBBAABAAAAAAAAABUBAwABAAAAAQAAABYBAwABAAAAEgAAABcBBAABAAAAAAAAABwBAwABAAAAAQAAAFMBAwABAAAAAwAAAA6DDAADAAAAzgAAAIKEDAAGAAAA5gAAAK+HAwAgAAAAFgEAALCHDAACAAAAVgEAALGHAgAIAAAAZgEAAAAAAADNzEQtza0wP+Q4kVqKIC0/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADpmsk322BeQM3MzMzMDDlAAAAAAAAAAAABAAEAAAAHAAAEAAABAAIAAQQAAAEAAQAACAAAAQDmEAEIsYcHAAAABggAAAEAjiMJCLCHAQABAAsIsIcBAAAAiG10lh2kckAAAABAplRYQVdHUyA4NHwAoJ1LQDTzSkATGUpA/4JIQHenR0BuskZAX6NFQF+jRUDJjERAKEpCQLseQUBftT5ALXg9QPIDPEATTjpAE046QBNOOkATTjpAdWI4QAGfNkCgnUtANPNKQBMZSkD/gkhAd6dHQG6yRkBfo0VAX6NFQMmMREAoSkJAux5BQF+1PkAteD1A8gM8QBNOOkATTjpAE046QBNOOkB1YjhAAZ82QCLTS0B+FktA7kJKQDm0SEC5ykdAHsdGQJi7RUCYu0VAaahEQD1sQkDlQ0FAeuA+QHF/PUDO7jtA/RM6QP0TOkD9EzpA/RM6QD9WOEDv6zZATwZMQFY3S0ALdkpA0dRIQJvhR0C94UZAyNlFQMjZRUADykRAPJRCQOZuQUCW7D5Acmg9QGOzO0CtAzpArQM6QK0DOkCtAzpAmXI4QJlnN0COEExAsl9LQHmXSkAQ5UhAGfpHQJQCR0A2/kVANv5FQNjxREBdwkJA9J9BQJLcPkAJNj1AG6k7QGAjOkCtAzpArQM6QK0DOkCZcjhAmWc3QI4QTECyX0tAeZdKQBDlSEAZ+kdAlAJHQDb+RUA2/kVA2PFEQF3CQkD0n0FAktw+QAk2PUAbqTtAYCM6QGAjOkBgIzpAYCM6QL+9OEBg5jdA/BBMQJRvS0DAsUpAE/dIQFoUSEAlJUdALSlGQC0pRkAwIEVA4fZCQE62QUAUsz5AjjI9QM3MO0DtbzpA7W86QO1vOkDtbzpA1jo5QBhjOEBd/ktA5mxLQEm+SkBuFElAjTBIQJlJR0DzVUZA81VGQFtVRUCiEkNAbrRBQJa2PkA0Wz1ALCA8QNnROkDZ0TpA2dE6QNnROkA30zlAzf04QGf1S0CsWUtAJ8JKQLM9SUDDWEhAJHBHQLSERkC0hEZAX4xFQHEgQ0BuqUFAq/E+QKa6PUA+gjxAmT07QJk9O0CZPTtAmT07QGVvOkDymzlAH1ZMQCCtS0A4CktAin1JQJGNSEBXo0dAqLVGQKi1RkDdrEVACh5DQD/IQUACVT9AcCA+QFnqPECC0ztAgtM7QILTO0CC0ztAFwc7QDQ1OkBAVk1A5qBMQGHmS0ANNEpAuDdJQHcqSEDqCkdA6gpHQMrXRUBpiENACm9CQMQjQEAL8z5A47s9QLrpPEC66TxAuuk8QLrpPEAaFTxA7T47QNeRTUAW4kxA8CpMQK+VSkDfmElANHRIQOc8R0DnPEdALxRGQBDuQ0AP10JA0KZAQKWNP0AwbT5AOpY9QDqWPUA6lj1AOpY9QIy8PEAe4TtA0cZNQDQsTUBteExAoedKQPLqSUAXw0hAIKxHQCCsR0BYo0ZAVpxEQMGEQ0DuXEFAr0dAQP4lP0CyST5Askk+QLJJPkCyST5AZmo9QByJPECx9U1AeHBNQEPPTEDRKEtA3yxKQKgkSUCYKkhAmCpIQGFBR0C/VEVAe1lEQGhRQkB7IkFArwRAQIMiP0CyST5Askk+QLJJPkBmaj1AHIk8QLH1TUB4cE1AQ89MQNEoS0DfLEpAqCRJQJgqSECYKkhAYUFHQL9URUB7WURAaFFCQHsiQUCvBEBAgyI/QIMiP0CDIj9AgyI/QAE9PkAwNz1AEx9OQHmvTUDzFE1AZGhLQByASkCNl0lANrpIQDa6SEBi3UdAPAtGQOg3RUATT0NAdfBBQBvAQEASwj9AEsI/QBLCP0ASwj9AOdg+QIqwPUCsYU5AwdxNQFRJTUDXv0tAFetKQBMYSkD+M0lA/jNJQM1NSEB5nEZAs/JFQJwpREBzxkJAPppBQH+AQEB/gEBAf4BAQH+AQEAWej9A5DA+QBqrTkAHF05ATW5NQN4lTEAlcktAmqNKQLfFSUAY1khAGNZIQKNBR0Bvo0ZAtNZEQM+LQ0BjdEJAFz9BQBc/QUAXP0FAFz9BQDUcQEDduD5AEQAAAQMAAQAAABQAAAABAQMAAQAAABIAAAACAQMAAQAAACAAAAADAQMAAQAAAAEAAAAGAQMAAQAAAAEAAAARAQQAAQAAAG4BAAAVAQMAAQAAAAEAAAAWAQMAAQAAABIAAAAXAQQAAQAAAKAFAAAcAQMAAQAAAAEAAABTAQMAAQAAAAMAAAAOgwwAAwAAAOAHAACChAwABgAAAPgHAACvhwMAIAAAACgIAACwhwwAAgAAAGgIAACxhwIACAAAAHgIAACBpAIAGQAAAIAIAAAAAAAAzcxELc2tMD/kOJFaiiAtPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6ZrJN9tgXkDNzMzMzAw5QAAAAAAAAAAAAQABAAAABwAABAAAAQACAAEEAAABAAEAAAgAAAEA5hABCLGHBwAAAAYIAAABAI4jCQiwhwEAAQALCLCHAQAAAIhtdJYdpHJAAAAAQKZUWEFXR1MgODR8AC0zLjQwMjgyMzA2MDczNzA5NjUzZSszOAA=`
let u8a = b642u8arr(b64Tif)
// lon 121.51338 121.51847
// lat 25.046 25.05

let BD = buildFindPointInTiff
let bd = new BD()
await bd.init(u8a)

p = [121.51353, 25.04987]
r = await bd.getPoint(p)
console.log(r)
// => 3.1814956665039062

p = [121.51835, 25.04608]
r = await bd.getPoint(p)
console.log(r)
// => 2.9800331592559814

p = [121.51353, 25.05016]
r = await bd.getPoint(p)
console.log(r)
// => 'unknow'

p = [121.51353, 25.05016]
r = await bd.getPoint(p, { def: '未知' })
console.log(r)
// => '未知'
Returns:

回傳函數物件,包含init、isInit、getPoint函數。init為初始化,輸入inp與opt,無輸出,isInit為回傳是否初始化布林值,無輸入。getPoint為查詢點位於點陣圖內數值,輸入p與opt。

Type
Object

(static) bufferMultiPolygon(pgs, w, optopt) → {Array}

Description:
  • 針對MultiPolygon進行Buffer處理

    Unit Test: Github

Source:
Example
let pgs
let r

pgs = [ //ringString
    [0, 0],
    [100, 0],
    [100, 1],
    [0, 1],
    [0, 0], //閉合
]
r = bufferMultiPolygon(pgs, 1)
console.log(JSON.stringify(r))
// => [[[[-1.001141328901417,0.0016753375821097873],[-0.9828471338128442,-0.16972115991069422],[-0.9267373199338761,-0.3346332604401984],[-0.8349336578934242,-0.48675182181191506],[-0.7109147085413277,-0.6202345462697216],[-0.559394180587721,-0.729923376805404],[-0.38615360668544263,-0.811541439833041],[-0.19783329290733154,-0.8618623554235615],[-0.0016872193065963293,-0.8788447694463676],[100.00168721930659,-0.8788447694463676],[100.19783329290733,-0.8618623554235615],[100.38615360668544,-0.811541439833041],[100.55939418058772,-0.7299233768054038],[100.71091470854132,-0.6202345462697216],[100.83493365789343,-0.48675182181191484],[100.92673731993388,-0.3346332604401984],[100.98284713381284,-0.16972115991069422],[101.00114132890143,0.0016753375821097873],[101.00130637437861,0.9962692468004231],[100.98342526263642,1.166068608930073],[100.92842740011626,1.3296521767917848],[100.8383471832878,1.4808799222131859],[100.71652842614444,1.614052695861241],[100.56751027969496,1.7241206065185686],[100.3968695299825,1.806872516804512],[100.21102286823793,1.859099826845344],[100.01699438082024,1.878727728773804],[-0.016994380820243554,1.878727728773804],[-0.21102286823793245,1.859099826845344],[-0.3968695299824859,1.806872516804512],[-0.5675102796949614,1.7241206065185688],[-0.7165284261444422,1.6140526958612413],[-0.8383471832878048,1.4808799222131859],[-0.9284274001162607,1.329652176791785],[-0.9834252626364106,1.166068608930073],[-1.00130637437862,0.9962692468004231],[-1.001141328901417,0.0016753375821097873]]]]

pgs = [ //ringString
    [0, 0],
    [100, 0],
    [100, 1],
    [0, 1],
]
r = bufferMultiPolygon(pgs, 1)
console.log(JSON.stringify(r))
// => [[[[-1.001141328901417,0.0016753375821097873],[-0.9828471338128442,-0.16972115991069422],[-0.9267373199338761,-0.3346332604401984],[-0.8349336578934242,-0.48675182181191506],[-0.7109147085413277,-0.6202345462697216],[-0.559394180587721,-0.729923376805404],[-0.38615360668544263,-0.811541439833041],[-0.19783329290733154,-0.8618623554235615],[-0.0016872193065963293,-0.8788447694463676],[100.00168721930659,-0.8788447694463676],[100.19783329290733,-0.8618623554235615],[100.38615360668544,-0.811541439833041],[100.55939418058772,-0.7299233768054038],[100.71091470854132,-0.6202345462697216],[100.83493365789343,-0.48675182181191484],[100.92673731993388,-0.3346332604401984],[100.98284713381284,-0.16972115991069422],[101.00114132890143,0.0016753375821097873],[101.00130637437861,0.9962692468004231],[100.98342526263642,1.166068608930073],[100.92842740011626,1.3296521767917848],[100.8383471832878,1.4808799222131859],[100.71652842614444,1.614052695861241],[100.56751027969496,1.7241206065185686],[100.3968695299825,1.806872516804512],[100.21102286823793,1.859099826845344],[100.01699438082024,1.878727728773804],[-0.016994380820243554,1.878727728773804],[-0.21102286823793245,1.859099826845344],[-0.3968695299824859,1.806872516804512],[-0.5675102796949614,1.7241206065185688],[-0.7165284261444422,1.6140526958612413],[-0.8383471832878048,1.4808799222131859],[-0.9284274001162607,1.329652176791785],[-0.9834252626364106,1.166068608930073],[-1.00130637437862,0.9962692468004231],[-1.001141328901417,0.0016753375821097873]]]]

pgs = [ //polygon
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ]
]
r = bufferMultiPolygon(pgs, 1)
console.log(JSON.stringify(r))
// => [[[[-1.001141328901417,0.0016753375821097873],[-0.9828471338128442,-0.16972115991069422],[-0.9267373199338761,-0.3346332604401984],[-0.8349336578934242,-0.48675182181191506],[-0.7109147085413277,-0.6202345462697216],[-0.559394180587721,-0.729923376805404],[-0.38615360668544263,-0.811541439833041],[-0.19783329290733154,-0.8618623554235615],[-0.0016872193065963293,-0.8788447694463676],[100.00168721930659,-0.8788447694463676],[100.19783329290733,-0.8618623554235615],[100.38615360668544,-0.811541439833041],[100.55939418058772,-0.7299233768054038],[100.71091470854132,-0.6202345462697216],[100.83493365789343,-0.48675182181191484],[100.92673731993388,-0.3346332604401984],[100.98284713381284,-0.16972115991069422],[101.00114132890143,0.0016753375821097873],[101.00130637437861,0.9962692468004231],[100.98342526263642,1.166068608930073],[100.92842740011626,1.3296521767917848],[100.8383471832878,1.4808799222131859],[100.71652842614444,1.614052695861241],[100.56751027969496,1.7241206065185686],[100.3968695299825,1.806872516804512],[100.21102286823793,1.859099826845344],[100.01699438082024,1.878727728773804],[-0.016994380820243554,1.878727728773804],[-0.21102286823793245,1.859099826845344],[-0.3968695299824859,1.806872516804512],[-0.5675102796949614,1.7241206065185688],[-0.7165284261444422,1.6140526958612413],[-0.8383471832878048,1.4808799222131859],[-0.9284274001162607,1.329652176791785],[-0.9834252626364106,1.166068608930073],[-1.00130637437862,0.9962692468004231],[-1.001141328901417,0.0016753375821097873]]]]

pgs = [ //polygon
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = bufferMultiPolygon(pgs, 1)
console.log(JSON.stringify(r))
// => [[[[-1.001155553386317,0.00020218490746980633],[-0.9820125492690016,-0.19485767359241968],[-0.9251387932224696,-0.38243348696414925],[-0.8327132969498687,-0.555321279824778],[-0.7082782159291466,-0.7068780908504364],[-0.5566054036321767,-0.8312763302163503],[-0.3835158174465588,-0.9237277892855092],[-0.19565803014640396,-0.9806686460552702],[-0.0002538669037234854,-0.9998981048986327],[10.000253866903723,-0.9998981048986327],[10.195658030146403,-0.9806686460552702],[10.38351581744656,-0.9237277892855092],[10.556605403632176,-0.8312763302163495],[10.708278215929147,-0.7068780908504364],[10.83271329694987,-0.5553212798247783],[10.925138793222468,-0.3824334869641492],[10.982012549269001,-0.1948576735924193],[11.001155553386317,0.00020218490746980633],[11.001308157005216,0.9996428211826395],[10.982257682211564,1.1945218799229023],[10.925533315715452,1.3819493209356362],[10.83329851355212,1.55473889694727],[10.709077513563999,1.7062614400017102],[10.557623401764781,1.8306986246098138],[10.384738788703551,1.9232666900056332],[10.197055258170192,1.9804014175926012],[10.001779585080351,1.9998969422657566],[-0.0017795850803521507,1.9998969422657566],[-0.19705525817019212,1.9804014175926012],[-0.3847387887035519,1.9232666900056334],[-0.5576234017647811,1.8306986246098143],[-0.7090775135639995,1.7062614400017102],[-0.8332985135521189,1.5547388969472695],[-0.9255333157154515,1.3819493209356362],[-0.9822576822115646,1.1945218799229025],[-1.0013081570052154,0.9996428211826395],[-1.001155553386317,0.00020218490746980633]]]]

pgs = [ //polygon
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ],
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = bufferMultiPolygon(pgs, 1)
console.log(JSON.stringify(r))
// => [[[[-1.001141328901417,0.0016753375821097873],[-0.9829652373939834,-0.1691864014690503],[-0.9828759068893769,-0.16944903103545159],[-0.9828471338128442,-0.16972115991069422],[-0.9642267691588657,-0.22433433005943731],[-0.9272069363899038,-0.3336248371138306],[-0.9269149700562374,-0.33410950396501116],[-0.9267373199338761,-0.3346332604401984],[-0.8903308935608486,-0.3948874359058604],[-0.835961623414144,-0.4853886073046619],[-0.8353702250141729,-0.4860270204908466],[-0.8349336578934242,-0.48675182181191506],[-0.7824274110195127,-0.5432159010460509],[-0.7126648789848471,-0.6186859299608387],[-0.7117015302688281,-0.6193864208225881],[-0.7109147085413277,-0.6202345462697216],[-0.6446160295572254,-0.668195147854552],[-0.5619732974171028,-0.7283987267469068],[-0.5605962119581879,-0.729052102669852],[-0.559394180587721,-0.729923376805404],[-0.48212743928754137,-0.7663024921222514],[-0.38960026351833515,-0.8102767443494782],[-0.3878031408082354,-0.8107634164195489],[-0.38615360668544263,-0.811541439833041],[-0.3011494349616489,-0.8342418049314271],[-0.20211072576851202,-0.8611046524848931],[-0.19992548149722325,-0.8613027037048243],[-0.19783329290733154,-0.8618623554235615],[-0.10860444692188248,-0.869583399882044],[-0.006680493376364686,-0.8788351261142445],[9.993416821174632,-0.9217879435862263],[10.188793002259466,-0.9049587543468377],[10.295194455828872,-0.8757829217517078],[100.00168721930659,-0.8788447694463676],[100.19783329290733,-0.8618623554235615],[100.38615360668544,-0.811541439833041],[100.55939418058772,-0.7299233768054038],[100.71091470854132,-0.6202345462697216],[100.83493365789343,-0.48675182181191484],[100.92673731993388,-0.3346332604401984],[100.98284713381284,-0.16972115991069422],[101.00114132890143,0.0016753375821097873],[101.00130637437861,0.9962692468004231],[100.98342526263642,1.166068608930073],[100.92842740011626,1.3296521767917848],[100.8383471832878,1.4808799222131859],[100.71652842614444,1.614052695861241],[100.56751027969496,1.7241206065185686],[100.3968695299825,1.806872516804512],[100.21102286823793,1.859099826845344],[100.01699438082024,1.878727728773804],[-0.016994380820243554,1.878727728773804],[-0.1157204876987387,1.8687373631615178],[-0.20220168724994378,1.8607327892917573],[-0.20650792922949912,1.8595562623618567],[-0.21102286823793245,1.859099826845344],[-0.30714947328128045,1.832073838565868],[-0.3897693406539745,1.8095331541523574],[-0.3931624216058025,1.807913350946488],[-0.3968695299824859,1.806872516804512],[-0.486882794767004,1.7631991356472565],[-0.5622020098330681,1.72730115650303],[-0.5646733033731067,1.7254949738678342],[-0.5675102796949614,1.7241206065185688],[-0.648108542369765,1.664556475139119],[-0.7129290018915503,1.6172692206642851],[-0.7145459093769313,1.6155153014865016],[-0.7165284261444422,1.6140526958612413],[-0.7847445548212969,1.5394316337665401],[-0.8362344707433637,1.4837039152301397],[-0.8371311983072628,1.4822073608091777],[-0.8383471832878048,1.4808799222131859],[-0.8916549506801756,1.3913170253111737],[-0.9274628819987873,1.331737619583264],[-0.9278275532110773,1.3306573138677165],[-0.9284274001162607,1.329652176791785],[-0.9648179595009568,1.221301519242358],[-0.9831829682906137,1.1671732571246638],[-0.9832418919046929,1.1666123607181955],[-0.9834252626364106,1.166068608930073],[-1.00130637437862,0.9962692468004231],[-1.001141328901417,0.0016753375821097873]]]]

pgs = [ //polygon
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ],
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = bufferMultiPolygon(pgs, 1, { supposeType: 'ringStrings' })
console.log(JSON.stringify(r))
// => [[[[-1.001141328901417,0.0016753375821097873],[-0.9828471338128442,-0.16972115991069422],[-0.9267373199338761,-0.3346332604401984],[-0.8349336578934242,-0.48675182181191506],[-0.7109147085413277,-0.6202345462697216],[-0.559394180587721,-0.729923376805404],[-0.38615360668544263,-0.811541439833041],[-0.19783329290733154,-0.8618623554235615],[-0.0016872193065963293,-0.8788447694463676],[100.00168721930659,-0.8788447694463676],[100.19783329290733,-0.8618623554235615],[100.38615360668544,-0.811541439833041],[100.55939418058772,-0.7299233768054038],[100.71091470854132,-0.6202345462697216],[100.83493365789343,-0.48675182181191484],[100.92673731993388,-0.3346332604401984],[100.98284713381284,-0.16972115991069422],[101.00114132890143,0.0016753375821097873],[101.00130637437861,0.9962692468004231],[100.98342526263642,1.166068608930073],[100.92842740011626,1.3296521767917848],[100.8383471832878,1.4808799222131859],[100.71652842614444,1.614052695861241],[100.56751027969496,1.7241206065185686],[100.3968695299825,1.806872516804512],[100.21102286823793,1.859099826845344],[100.01699438082024,1.878727728773804],[-0.016994380820243554,1.878727728773804],[-0.21102286823793245,1.859099826845344],[-0.3968695299824859,1.806872516804512],[-0.5675102796949614,1.7241206065185688],[-0.7165284261444422,1.6140526958612413],[-0.8383471832878048,1.4808799222131859],[-0.9284274001162607,1.329652176791785],[-0.9834252626364106,1.166068608930073],[-1.00130637437862,0.9962692468004231],[-1.001141328901417,0.0016753375821097873]]]]

pgs = [ //multiPolygon
    [
        [
            [0, 0],
            [100, 0],
            [100, 1],
            [0, 1],
        ],
        [
            [0, 0],
            [10, 0],
            [10, 1],
            [0, 1],
        ],
        [
            [0, 0],
            [-10, 0],
            [-10, 123],
            [0, 1],
        ]
    ]
]
r = bufferMultiPolygon(pgs, 1)
console.log(JSON.stringify(r))
// => [[[[-0.8012541837164568,-0.17340281498851945],[-0.7845905665553953,-0.36227885731056975],[-0.7362060966497698,-0.5362500018687244],[-0.6581257104469943,-0.688322784190506],[-0.5535304542476391,-0.8124108634048052],[-0.4266299774554017,-0.9035630726703152],[-0.2825015231454891,-0.958146676868447],[-0.12690006663656955,-0.9739812775086525],[0.03395545341221722,-0.9504200786900888],[0.19361433624631713,-0.8883763411426563],[0.34563851486033076,-0.7902939089966787],[1.5370514741011896,0.13454100276614617],[9.19064767617874,0.06717684053056396],[9.191364068615226,-0.13595424650179797],[9.20133965362993,-0.13421645399411475],[10.158988901190282,0.9701242544649328],[10.16096403486849,0.9822526475809891],[2.866804797833092,1.137647522096021],[99.68460366306947,-0.7778744465922519],[99.83402263305543,-0.8744779865054448],[99.98971255084359,-0.9368294391315382],[100.14560908372206,-0.9625601240475504],[100.29567676380367,-0.9507068041095973],[100.43412954295192,-0.9017417273394963],[100.55563852611013,-0.817553248360399],[100.65552164066368,-0.7013779275513093],[100.72991078940285,-0.5576858501436441],[100.77589259056286,-0.3920217971362746],[100.79161911635269,-0.21080593328834593],[100.79663729766196,0.7858468460411016],[100.78366780468126,0.9687873923303338],[100.74205919560113,1.1530813676567635],[100.67320841116904,1.331961262596526],[100.57951447407378,1.498814188916489],[100.46430988704897,1.6474303942232118],[100.33175495294144,1.7722428029343886],[-0.3611196144473517,1.784612946923815],[-0.48871675992881103,1.6636298723025738],[-0.5991787964146019,1.5197286583585954],[-0.6887538943585044,1.357969542007828],[-0.754444795325827,1.1840064755905042],[-0.7825727584436893,1.0562001800792606],[-0.784546778721443,1.0465932538060978],[-0.7846866456585744,1.0466026995606184],[-0.7940988404174638,1.003882122853538],[-0.7944829149075918,0.998255844884385],[-0.7957274513076762,0.9922035987885709],[-0.8064662133136347,0.8238140372657559],[-0.8012541837164568,-0.17340281498851945]]]]
Parameters:
Name Type Attributes Default Description
pgs Array

輸入Polygon資料陣列,為[ [[x11,y11],[x12,y12],...], [[x21,y21],[x22,y22],...] ]Polygon構成之陣列

w Number

輸入Buffer寬度數字

opt Object <optional>
{}

輸入設定物件,預設{}

Properties
Name Type Attributes Default Description
units String <optional>
'degrees'

輸入Buffer寬度單位,可選'degrees'、'radians'、'meters'、'kilometers'、'feet'、'miles',預設'degrees'

supposeType String <optional>
'polygons'

輸入提取模式字串,當數據座標深度為2時,使用polygons代表每個其內多邊形為獨立polygon,若為ringStrings則表示其內多邊形為交錯的ringString(代表聯集與剔除),預設'polygons'

Returns:

回傳MultiPolygon陣列

Type
Array

(static) calcContours(points) → {Array|Object}

Description:
  • 不規則點基於三角化網格計算等值線圖

    Unit Test: Github

Source:
Example
let opt
let pgs

let points = [
    [24.325, 120.786, 0], [23.944, 120.968, 10], [24.884, 121.234, 20], [24.579, 121.345, 80], [24.664, 121.761, 40], [23.803, 121.397, 30],
    [23.727, 120.772, 0], [23.539, 120.975, 0], [23.612, 121.434, 0],
    [23.193, 120.355, 22], [23.456, 120.890, 42], [23.280, 120.551, 25], [23.162, 121.247, 5],
]

let containInner = [ //此結構代表1個polygon, leaflet可支援顯示, 但turf做intersect不支援, 故l-contour會通過toMultiPolygon轉換才能支援
    [
        [24.28, 120.842], [24.494, 121.203], [24.314, 121.190], [24.232, 121.109], [24.249, 120.910],
    ],
    [
        [24.217, 120.851], [24.172, 121.242], [24.059, 121.333], [24.001, 121.055],
    ],
]

let clipInner = [ //此結構代表1個polygon, leaflet可支援顯示, 但turf做difference不支援, 故l-contour會通過toMultiPolygon轉換才能支援
    [
        [24.28, 120.842], [24.494, 121.203], [24.314, 121.190], [24.232, 121.109], [24.249, 120.910],
    ],
    [
        [24.217, 120.851], [24.172, 121.242], [24.059, 121.333], [24.001, 121.055],
    ],
]

let clipOuter = [
    [24.585, 120.79], [24.9, 121.620], [23.984, 121.6], [23.941, 121.196], [24.585, 120.79]
]

let thresholds = [0, 5, 10, 20, 30, 40, 55, 70, 85]

opt = {
    containInner,
    // clipInner,
    // clipOuter,
    // thresholds,
}
pgs = calcContours(points, opt)
fs.writeFileSync('./calcContours1.json', JSON.stringify(pgs), 'utf8')
console.log(pgs)
// => [
//   {
//     sepZone: '',
//     latLngs: [ [Array], [Array] ],
//     effectArea: 8816415983.520641,
//     effectAreaCentroid: [ 23.973333333333333, 121.13616666666665 ],
//     range: { text: '0 - 10', low: 0, up: 10 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   },
//   {
//     sepZone: '',
//     latLngs: [ [Array], [Array], [Array] ],
//     effectArea: 6313849792.51668,
//     effectAreaCentroid: [ 23.80531082115246, 121.00212446033244 ],
//     range: { text: '10 - 20', low: 10, up: 20 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   },
//   {
//     sepZone: '',
//     latLngs: [ [Array], [Array] ],
//     effectArea: 4644527033.145393,
//     effectAreaCentroid: [ 23.791076270349798, 120.96719391394832 ],
//     range: { text: '20 - 30', low: 20, up: 30 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   },
//   {
//     sepZone: '',
//     latLngs: [ [Array], [Array] ],
//     effectArea: 3211476473.817216,
//     effectAreaCentroid: [ 24.025569342289934, 121.2215115677248 ],
//     range: { text: '30 - 40', low: 30, up: 40 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   },
//   {
//     sepZone: '',
//     latLngs: [ [Array], [Array] ],
//     effectArea: 2077979122.6009896,
//     effectAreaCentroid: [ 24.155744629924033, 121.28620957869633 ],
//     range: { text: '40 - 50', low: 40, up: 50 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   },
//   {
//     sepZone: '',
//     latLngs: [ [Array] ],
//     effectArea: 1165016840.7246127,
//     effectAreaCentroid: [ 24.45565142857143, 121.3283007142857 ],
//     range: { text: '50 - 60', low: 50, up: 60 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   }
// ]

opt = {
    // containInner,
    clipInner,
    // clipOuter,
    // thresholds,
}
pgs = calcContours(points, opt)
fs.writeFileSync('./calcContours2.json', JSON.stringify(pgs), 'utf8')
console.log(pgs)
// => [
//   {
//     sepZone: '',
//     latLngs: [ [Array] ],
//     effectArea: 8816415983.520641,
//     effectAreaCentroid: [ 23.973333333333333, 121.13616666666665 ],
//     range: { text: '0 - 10', low: 0, up: 10 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   },
//   {
//     sepZone: '',
//     latLngs: [ [Array], [Array], [Array], [Array] ],
//     effectArea: 6313849792.51668,
//     effectAreaCentroid: [ 23.80531082115246, 121.00212446033244 ],
//     range: { text: '10 - 20', low: 10, up: 20 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   },
//   {
//     sepZone: '',
//     latLngs: [ [Array], [Array], [Array], [Array], [Array] ],
//     effectArea: 4644527033.145393,
//     effectAreaCentroid: [ 23.791076270349798, 120.96719391394832 ],
//     range: { text: '20 - 30', low: 20, up: 30 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   },
//   {
//     sepZone: '',
//     latLngs: [ [Array], [Array], [Array], [Array] ],
//     effectArea: 3211476473.817216,
//     effectAreaCentroid: [ 24.025569342289934, 121.2215115677248 ],
//     range: { text: '30 - 40', low: 30, up: 40 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   },
//   {
//     sepZone: '',
//     latLngs: [ [Array], [Array] ],
//     effectArea: 2077979122.6009896,
//     effectAreaCentroid: [ 24.155744629924033, 121.28620957869633 ],
//     range: { text: '40 - 50', low: 40, up: 50 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   },
//   {
//     sepZone: '',
//     latLngs: [ [Array] ],
//     effectArea: 1165016840.7246127,
//     effectAreaCentroid: [ 24.45565142857143, 121.3283007142857 ],
//     range: { text: '50 - 60', low: 50, up: 60 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   },
//   {
//     sepZone: '',
//     latLngs: [ [Array] ],
//     effectArea: 517569529.67260885,
//     effectAreaCentroid: [ 24.49676761904762, 121.33386714285714 ],
//     range: { text: '60 - 70', low: 60, up: 70 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   },
//   {
//     sepZone: 'top',
//     latLngs: [ [Array] ],
//     effectArea: 129338350.80859056,
//     effectAreaCentroid: [ 24.537883809523812, 121.33943357142857 ],
//     range: { text: '70 - 80', low: 70, up: 80 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   }
// ]

opt = {
    // containInner,
    // clipInner,
    clipOuter,
    // thresholds,
}
pgs = calcContours(points, opt)
fs.writeFileSync('./calcContours3.json', JSON.stringify(pgs), 'utf8')
console.log(pgs)
// => [
//   {
//     sepZone: '',
//     latLngs: [ [Array] ],
//     effectArea: 8816415983.520641,
//     effectAreaCentroid: [ 23.973333333333333, 121.13616666666665 ],
//     range: { text: '0 - 10', low: 0, up: 10 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   },
//   {
//     sepZone: '',
//     latLngs: [ [Array], [Array] ],
//     effectArea: 6313849792.51668,
//     effectAreaCentroid: [ 23.80531082115246, 121.00212446033244 ],
//     range: { text: '10 - 20', low: 10, up: 20 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   },
//   {
//     sepZone: '',
//     latLngs: [ [Array], [Array], [Array], [Array] ],
//     effectArea: 4644527033.145393,
//     effectAreaCentroid: [ 23.791076270349798, 120.96719391394832 ],
//     range: { text: '20 - 30', low: 20, up: 30 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   },
//   {
//     sepZone: '',
//     latLngs: [ [Array], [Array], [Array] ],
//     effectArea: 3211476473.817216,
//     effectAreaCentroid: [ 24.025569342289934, 121.2215115677248 ],
//     range: { text: '30 - 40', low: 30, up: 40 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   },
//   {
//     sepZone: '',
//     latLngs: [ [Array] ],
//     effectArea: 2077979122.6009896,
//     effectAreaCentroid: [ 24.155744629924033, 121.28620957869633 ],
//     range: { text: '40 - 50', low: 40, up: 50 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   },
//   {
//     sepZone: '',
//     latLngs: [ [Array] ],
//     effectArea: 1165016840.7246127,
//     effectAreaCentroid: [ 24.45565142857143, 121.3283007142857 ],
//     range: { text: '50 - 60', low: 50, up: 60 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   },
//   {
//     sepZone: '',
//     latLngs: [ [Array] ],
//     effectArea: 517569529.67260885,
//     effectAreaCentroid: [ 24.49676761904762, 121.33386714285714 ],
//     range: { text: '60 - 70', low: 60, up: 70 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   },
//   {
//     sepZone: 'top',
//     latLngs: [ [Array] ],
//     effectArea: 129338350.80859056,
//     effectAreaCentroid: [ 24.537883809523812, 121.33943357142857 ],
//     range: { text: '70 - 80', low: 70, up: 80 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   }
// ]

opt = {
    // containInner,
    // clipInner,
    // clipOuter,
    thresholds,
}
pgs = calcContours(points, opt)
fs.writeFileSync('./calcContours4.json', JSON.stringify(pgs), 'utf8')
console.log(pgs)
// => [
//   {
//     sepZone: '',
//     latLngs: [ [Array] ],
//     effectArea: 8816415983.520641,
//     effectAreaCentroid: [ 23.973333333333333, 121.13616666666665 ],
//     range: { text: '0 - 5', low: 0, up: 5 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   },
//   {
//     sepZone: '',
//     latLngs: [ [Array], [Array] ],
//     effectArea: 7186533231.875366,
//     effectAreaCentroid: [ 23.802593637502845, 121.01686739291412 ],
//     range: { text: '5 - 10', low: 5, up: 10 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   },
//   {
//     sepZone: '',
//     latLngs: [ [Array], [Array] ],
//     effectArea: 6313849792.51668,
//     effectAreaCentroid: [ 23.80531082115246, 121.00212446033244 ],
//     range: { text: '10 - 20', low: 10, up: 20 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   },
//   {
//     sepZone: '',
//     latLngs: [ [Array], [Array] ],
//     effectArea: 4644527033.145393,
//     effectAreaCentroid: [ 23.791076270349798, 120.96719391394832 ],
//     range: { text: '20 - 30', low: 20, up: 30 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   },
//   {
//     sepZone: '',
//     latLngs: [ [Array], [Array] ],
//     effectArea: 3211476473.817216,
//     effectAreaCentroid: [ 24.025569342289934, 121.2215115677248 ],
//     range: { text: '30 - 40', low: 30, up: 40 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   },
//   {
//     sepZone: '',
//     latLngs: [ [Array], [Array] ],
//     effectArea: 2077979122.6009896,
//     effectAreaCentroid: [ 24.155744629924033, 121.28620957869633 ],
//     range: { text: '40 - 55', low: 40, up: 55 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   },
//   {
//     sepZone: '',
//     latLngs: [ [Array] ],
//     effectArea: 808871008.3417139,
//     effectAreaCentroid: [ 24.476209523809523, 121.33108392857142 ],
//     range: { text: '55 - 70', low: 55, up: 70 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   },
//   {
//     sepZone: 'top',
//     latLngs: [ [Array] ],
//     effectArea: 129338350.80859056,
//     effectAreaCentroid: [ 24.537883809523812, 121.33943357142857 ],
//     range: { text: '70 - 85', low: 70, up: 85 },
//     center: [ 23.973333333333333, 121.13616666666665 ]
//   }
// ]

opt = {
    withStyle: true,
    // returnGeojson: true,
}
pgs = calcContours(points, opt)
fs.writeFileSync('./calcContours5.json', JSON.stringify(pgs), 'utf8')
console.log(pgs)
// => [
//   {
//     sepZone: '',
//     latLngs: [ [Array] ],
//     effectArea: 8816415983.520641,
//     effectAreaCentroid: [ 23.973333333333333, 121.13616666666665 ],
//     range: { text: '0 - 10', low: 0, up: 10 },
//     center: [ 23.973333333333333, 121.13616666666665 ],
//     style: {
//       color: 'rgba(255, 255, 255, 1)',
//       weight: 1,
//       fillColor: 'rgba(255, 255, 255, 1)',
//       fillOpacity: 0.2,
//       stroke: 'rgba(255, 255, 255, 1)',
//       'stroke-width': 1,
//       'stroke-opacity': 1,
//       fill: 'rgba(255, 255, 255, 1)',
//       'fill-opacity': 0.2
//     }
//   },
//   {
//     sepZone: '',
//     latLngs: [ [Array], [Array] ],
//     effectArea: 6313849792.51668,
//     effectAreaCentroid: [ 23.80531082115246, 121.00212446033244 ],
//     range: { text: '10 - 20', low: 10, up: 20 },
//     center: [ 23.973333333333333, 121.13616666666665 ],
//     style: {
//       color: 'rgba(254, 200, 127, 1)',
//       weight: 1,
//       fillColor: 'rgba(254, 200, 127, 1)',
//       fillOpacity: 0.2,
//       stroke: 'rgba(254, 200, 127, 1)',
//       'stroke-width': 1,
//       'stroke-opacity': 1,
//       fill: 'rgba(254, 200, 127, 1)',
//       'fill-opacity': 0.2
//     }
//   },
//   {
//     sepZone: '',
//     latLngs: [ [Array], [Array] ],
//     effectArea: 4644527033.145393,
//     effectAreaCentroid: [ 23.791076270349798, 120.96719391394832 ],
//     range: { text: '20 - 30', low: 20, up: 30 },
//     center: [ 23.973333333333333, 121.13616666666665 ],
//     style: {
//       color: 'rgba(253, 135, 61, 1)',
//       weight: 1,
//       fillColor: 'rgba(253, 135, 61, 1)',
//       fillOpacity: 0.2,
//       stroke: 'rgba(253, 135, 61, 1)',
//       'stroke-width': 1,
//       'stroke-opacity': 1,
//       fill: 'rgba(253, 135, 61, 1)',
//       'fill-opacity': 0.2
//     }
//   },
//   {
//     sepZone: '',
//     latLngs: [ [Array], [Array] ],
//     effectArea: 3211476473.817216,
//     effectAreaCentroid: [ 24.025569342289934, 121.2215115677248 ],
//     range: { text: '30 - 40', low: 30, up: 40 },
//     center: [ 23.973333333333333, 121.13616666666665 ],
//     style: {
//       color: 'rgba(247, 75, 41, 1)',
//       weight: 1,
//       fillColor: 'rgba(247, 75, 41, 1)',
//       fillOpacity: 0.2,
//       stroke: 'rgba(247, 75, 41, 1)',
//       'stroke-width': 1,
//       'stroke-opacity': 1,
//       fill: 'rgba(247, 75, 41, 1)',
//       'fill-opacity': 0.2
//     }
//   },
//   {
//     sepZone: '',
//     latLngs: [ [Array], [Array] ],
//     effectArea: 2077979122.6009896,
//     effectAreaCentroid: [ 24.155744629924033, 121.28620957869633 ],
//     range: { text: '40 - 50', low: 40, up: 50 },
//     center: [ 23.973333333333333, 121.13616666666665 ],
//     style: {
//       color: 'rgba(225, 61, 39, 1)',
//       weight: 1,
//       fillColor: 'rgba(225, 61, 39, 1)',
//       fillOpacity: 0.2,
//       stroke: 'rgba(225, 61, 39, 1)',
//       'stroke-width': 1,
//       'stroke-opacity': 1,
//       fill: 'rgba(225, 61, 39, 1)',
//       'fill-opacity': 0.2
//     }
//   },
//   {
//     sepZone: '',
//     latLngs: [ [Array] ],
//     effectArea: 1165016840.7246127,
//     effectAreaCentroid: [ 24.45565142857143, 121.3283007142857 ],
//     range: { text: '50 - 60', low: 50, up: 60 },
//     center: [ 23.973333333333333, 121.13616666666665 ],
//     style: {
//       color: 'rgba(209, 48, 29, 1)',
//       weight: 1,
//       fillColor: 'rgba(209, 48, 29, 1)',
//       fillOpacity: 0.2,
//       stroke: 'rgba(209, 48, 29, 1)',
//       'stroke-width': 1,
//       'stroke-opacity': 1,
//       fill: 'rgba(209, 48, 29, 1)',
//       'fill-opacity': 0.2
//     }
//   },
//   {
//     sepZone: '',
//     latLngs: [ [Array] ],
//     effectArea: 517569529.67260885,
//     effectAreaCentroid: [ 24.49676761904762, 121.33386714285714 ],
//     range: { text: '60 - 70', low: 60, up: 70 },
//     center: [ 23.973333333333333, 121.13616666666665 ],
//     style: {
//       color: 'rgba(194, 37, 34, 1)',
//       weight: 1,
//       fillColor: 'rgba(194, 37, 34, 1)',
//       fillOpacity: 0.2,
//       stroke: 'rgba(194, 37, 34, 1)',
//       'stroke-width': 1,
//       'stroke-opacity': 1,
//       fill: 'rgba(194, 37, 34, 1)',
//       'fill-opacity': 0.2
//     }
//   },
//   {
//     sepZone: 'top',
//     latLngs: [ [Array] ],
//     effectArea: 129338350.80859056,
//     effectAreaCentroid: [ 24.537883809523812, 121.33943357142857 ],
//     range: { text: '70 - 80', low: 70, up: 80 },
//     center: [ 23.973333333333333, 121.13616666666665 ],
//     style: {
//       color: 'rgba(180, 30, 60, 1)',
//       weight: 1,
//       fillColor: 'rgba(180, 30, 60, 1)',
//       fillOpacity: 0.2,
//       stroke: 'rgba(180, 30, 60, 1)',
//       'stroke-width': 1,
//       'stroke-opacity': 1,
//       fill: 'rgba(180, 30, 60, 1)',
//       'fill-opacity': 0.2
//     }
//   }
// ]

opt = {
    withStyle: true,
    returnGeojson: true,
}
pgs = calcContours(points, opt)
fs.writeFileSync('./calcContours6.json', JSON.stringify(pgs), 'utf8')
console.log(pgs)
// => {
//   type: 'FeatureCollection',
//   features: [
//     { type: 'Feature', properties: [Object], geometry: [Object] },
//     { type: 'Feature', properties: [Object], geometry: [Object] },
//     { type: 'Feature', properties: [Object], geometry: [Object] },
//     { type: 'Feature', properties: [Object], geometry: [Object] },
//     { type: 'Feature', properties: [Object], geometry: [Object] },
//     { type: 'Feature', properties: [Object], geometry: [Object] },
//     { type: 'Feature', properties: [Object], geometry: [Object] },
//     { type: 'Feature', properties: [Object], geometry: [Object] }
//   ]
// }

opt = {
    withStyle: true,
    returnGeojson: true,
    inverseCoordinate: true,
}
pgs = calcContours(points, opt)
fs.writeFileSync('./calcContours7.json', JSON.stringify(pgs), 'utf8')
console.log(pgs)
// => {
//   type: 'FeatureCollection',
//   features: [
//     { type: 'Feature', properties: [Object], geometry: [Object] },
//     { type: 'Feature', properties: [Object], geometry: [Object] },
//     { type: 'Feature', properties: [Object], geometry: [Object] },
//     { type: 'Feature', properties: [Object], geometry: [Object] },
//     { type: 'Feature', properties: [Object], geometry: [Object] },
//     { type: 'Feature', properties: [Object], geometry: [Object] },
//     { type: 'Feature', properties: [Object], geometry: [Object] },
//     { type: 'Feature', properties: [Object], geometry: [Object] }
//   ]
// }
Parameters:
Name Type Attributes Default Description
points Array

輸入點陣列,各點可為[{x:x1,y:y1},{x:x2,y:y2},...]物件型態,或可為[[x1,y1],[x2,y2],...]陣列型態

opt.keyX String <optional>
'x'

輸入點物件之x座標欄位字串,預設'x'

opt.keyY String <optional>
'y'

輸入點物件之y座標欄位字串,預設'y'

opt.keyZ String <optional>
'z'

輸入點物件之z座標或值欄位字串,預設'z'

opt.containInner Array <optional>
null

輸入等值線圖須保留之MultiPolygon陣列,也就是等值線圖取交集,預設null

opt.clipInner Array <optional>
null

輸入等值線圖須剔除以內之MultiPolygon陣列,也就是等值線圖取差集,預設null

opt.clipOuter Array <optional>
null

輸入等值線圖須剔除以外之MultiPolygon陣列,效果同containInner是等值線圖取交集,預設null

opt.thresholds Array <optional>
null

輸入指定等值線切分值陣列,預設null

opt.withStyle Boolean <optional>
false

輸入是否給予樣式布林值,若returnGeojson給予true也會強制給予樣式,預設false

opt.kpGradientColor function <optional>
{0: 'rgb(255, 255, 255)',0.2: 'rgb(254, 178, 76)',0.4: 'rgb(252, 78, 42)',0.6: 'rgb(220, 58, 38)',0.8: 'rgb(200, 40, 23)',1: 'rgb(180, 30, 60)'}

輸入內插顏色用梯度物件,預設{0: 'rgb(255, 255, 255)',0.2: 'rgb(254, 178, 76)',0.4: 'rgb(252, 78, 42)',0.6: 'rgb(220, 58, 38)',0.8: 'rgb(200, 40, 23)',1: 'rgb(180, 30, 60)'}

opt.funGetFillColor function <optional>
null

輸入內插面顏色用函數,輸入為(k,n),分別代表當前等值線指標與最大指標(也就是等值線數-1),不提供函數時使用預設kpGradientColor進行內插,預設null

opt.fillOpacity Number <optional>
0.2

輸入面顏色透明度數字,預設0.2

opt.lineColor Number <optional>
''

輸入線顏色字串,若有funGetLineColor則優先使用,若無則預設使用面顏色,預設''

opt.funGetLineColor function <optional>
null

輸入內插線顏色用函數,若有給予則覆蓋lineColor,輸入為(k,n),分別代表當前等值線指標與最大指標(也就是等值線數-1),不提供函數時使用預設為面顏色,預設null

opt.lineOpacity Number <optional>
1

輸入線顏色透明度數字,預設1

opt.lineWidth Number <optional>
1

輸入線寬度數字,預設1

opt.returnGeojson Boolean <optional>
false

輸入是否回傳GeoJSON布林值,若為true會強制withStyle給予true,預設false

opt.inverseCoordinate Boolean <optional>
false

輸入是否交換經緯度布林值,因GeoJSON之各點為經緯度,而Leaflet為緯經度,若座標來源與輸出須交換經緯度則使用此設定。預設false

Returns:

回傳點物件陣列或點物件,若使用returnWithVariogram=true則回傳物件資訊,若發生錯誤則回傳錯誤訊息物件

Type
Array | Object

(static) calcDelaunay(points, optopt) → {Object}

Description:
  • 計算Delaunay三角網格

    Unit Test: Github

Source:
Example
let ps
let o
let r

ps = [{ x: 243, y: 206 }, { x: 233, y: 225 }, { x: 21, y: 325 }, { x: 953, y: 283 }, { x: 1092, y: 290 }, { x: 744, y: 200 }, { x: 174, y: 3 }, { x: 537, y: 368 }, { x: 1151, y: 371, ext: 'abc' }, { x: 814, y: 252 }]
r = calcDelaunay(ps)
console.log(r)
// => {
//   triangles: [
//     { n0: 5, n1: 9, n2: 3 },
//     { n0: 9, n1: 4, n2: 3 },
//     { n0: 9, n1: 8, n2: 4 },
//     { n0: 4, n1: 8, n2: 3 },
//     { n0: 5, n1: 7, n2: 9 },
//     { n0: 9, n1: 7, n2: 8 },
//     { n0: 0, n1: 7, n2: 5 },
//     { n0: 6, n1: 0, n2: 5 },
//     { n0: 0, n1: 1, n2: 7 },
//     { n0: 3, n1: 6, n2: 5 }
//   ]
// }

ps = [{ x: 243, y: 206 }, { x: 233, y: 225 }, { x: 21, y: 325 }, { x: 953, y: 283 }, { x: 1092, y: 290 }, { x: 744, y: 200 }, { x: 174, y: 3 }, { x: 537, y: 368 }, { x: 1151, y: 371, ext: 'abc' }, { x: 814, y: 252 }]
o = calcDelaunay(ps, { withFinder: true })
r = o.funFindIn({ x: 1151, y: 371 })
console.log(r)
// => 8
r = o.funFindIn({ x: 1071, y: 371 }, { returnPoint: true })
console.log(r)
// => { x: 1151, y: 371, ext: 'abc' }
r = o.funFindIn({ x: 1061, y: 371 })
console.log(r)
// => 4
Parameters:
Name Type Attributes Default Description
points Array

輸入二維座標加觀測數據點陣列,為[{x:x1,y:y1,z:z1},{x:x2,y:y2,z:z2},...]點物件之陣列

opt Object <optional>
{}

輸入設定物件,預設{}

Properties
Name Type Attributes Default Description
keyX String <optional>
'x'

輸入點物件之x欄位字串,為座標,預設'x'

keyY String <optional>
'y'

輸入點物件之y欄位字串,為座標,預設'y'

withFinder Boolean <optional>
false

輸入是否多回傳查詢x,y座標所在網格函數布林值,預設false

withInst Boolean <optional>
false

輸入是否多回傳D3的Delaunay建構物件布林值,預設false

Returns:

回傳三角網格資訊物件,triangles為三角網格之節點指標,若發生錯誤則回傳錯誤訊息物件

Type
Object

(static) calcVoronoi(points, optopt) → {Object}

Description:
  • 計算Voronoi多邊形網格

    Unit Test: Github

Source:
Example
let ps
let o
let r

ps = [{ x: 243, y: 206 }, { x: 233, y: 225 }, { x: 21, y: 325 }, { x: 953, y: 283 }, { x: 1092, y: 290 }, { x: 744, y: 200 }, { x: 174, y: 3 }, { x: 537, y: 368 }, { x: 1151, y: 371, ext: 'abc' }, { x: 814, y: 252 }]
r = calcVoronoi(ps)
console.log(r)
// => {
//   nodes: [
//     { x: 492.28293900586067, y: 101.37540698936401 },
//     { x: 386.3692756036636, y: 293.58909242298085 },
//     { x: 98.28090392098173, y: 141.96363364262197 },
//     { x: 491.16970240018804, y: 8.420150415699638 },
//     { x: 341.3003289473684, y: 389.4 },
//     { x: 180.96226415094338, y: 389.4 },
//     { x: 68.03825239785515, y: 150.0010950834529 },
//     { x: -35.5, y: 389.4 },
//     { x: -35.5, y: 100.80434782608694 },
//     { x: 1207.5, y: 60.85114503816796 },
//     { x: 964.0722237025195, y: 189.99794238683128 },
//     { x: 855.7004539898726, y: 122.74938885978698 },
//     { x: 742.008133971292, y: -15.400000000000006 },
//     { x: 1207.5, y: -15.400000000000006 },
//     { x: 936.8158273381295, y: 389.4 },
//     { x: 1207.5, y: 267.858024691358 },
//     { x: 1040.6372881355933, y: 389.4 },
//     { x: 690.3167288225892, y: 345.381326584976 },
//     { x: 499.4022807017544, y: -15.400000000000006 },
//     { x: -35.5, y: -15.400000000000006 },
//     { x: 708.7505415162454, y: 389.4 },
//     { x: 1207.5, y: 389.4 }
//   ],
//   polygons: [
//     [ 0, 1, 2, 3, 0 ],
//     [ 1, 4, 5, 6, 2, 1 ],
//     [ 7, 8, 6, 5, 7 ],
//     [ 9, 10, 11, 12, 13, 9 ],
//     [ 14, 10, 9, 15, 16, 14 ],
//     [
//       12, 11, 17, 0,
//        3, 18, 12
//     ],
//     [
//       19, 18,  3, 2,
//        6,  8, 19
//     ],
//     [ 4, 1, 0, 17, 20, 4 ],
//     [ 16, 15, 21, 16 ],
//     [ 11, 10, 14, 20, 17, 11 ]
//   ]
// }

ps = [{ x: 243, y: 206 }, { x: 233, y: 225 }, { x: 21, y: 325 }, { x: 953, y: 283 }, { x: 1092, y: 290 }, { x: 744, y: 200 }, { x: 174, y: 3 }, { x: 537, y: 368 }, { x: 1151, y: 371, ext: 'abc' }, { x: 814, y: 252 }]
r = calcVoronoi(ps, {
    box: {
        xb0: -100,
        yb0: -50,
        xb1: 1300,
        yb1: 400,
    }
})
// console.log(r)
// => {
//   nodes: [
//     { x: 492.28293900586067, y: 101.37540698936401 },
//     { x: 386.3692756036636, y: 293.58909242298085 },
//     { x: 98.28090392098173, y: 141.96363364262197 },
//     { x: 491.16970240018804, y: 8.420150415699638 },
//     { x: 336.3141447368421, y: 400 },
//     { x: 185.96226415094338, y: 400 },
//     { x: 68.03825239785515, y: 150.0010950834529 },
//     { x: -100, y: 400 },
//     { x: -100, y: 70.15683229813664 },
//     { x: 1300, y: 11.776717557251857 },
//     { x: 964.0722237025195, y: 189.99794238683128 },
//     { x: 855.7004539898726, y: 122.74938885978698 },
//     { x: 713.5334928229665, y: -50 },
//     { x: 1300, y: -50 },
//     { x: 935.3669064748201, y: 400 },
//     { x: 1300, y: 200.4814814814814 },
//     { x: 1026.0847457627117, y: 400 },
//     { x: 690.3167288225892, y: 345.381326584976 },
//     { x: 511.3605263157895, y: -50 },
//     { x: -100, y: -50 },
//     { x: 713.1895306859205, y: 400 },
//     { x: 1300, y: 400 }
//   ],
//   polygons: [
//     [ 0, 1, 2, 3, 0 ],
//     [ 1, 4, 5, 6, 2, 1 ],
//     [ 7, 8, 6, 5, 7 ],
//     [ 9, 10, 11, 12, 13, 9 ],
//     [ 14, 10, 9, 15, 16, 14 ],
//     [
//       12, 11, 17, 0,
//        3, 18, 12
//     ],
//     [
//       19, 18,  3, 2,
//        6,  8, 19
//     ],
//     [ 4, 1, 0, 17, 20, 4 ],
//     [ 21, 16, 15, 21 ],
//     [ 11, 10, 14, 20, 17, 11 ]
//   ]
// }

ps = [{ x: 243, y: 206 }, { x: 233, y: 225 }, { x: 21, y: 325 }, { x: 953, y: 283 }, { x: 1092, y: 290 }, { x: 744, y: 200 }, { x: 174, y: 3 }, { x: 537, y: 368 }, { x: 1151, y: 371, ext: 'abc' }, { x: 814, y: 252 }]
o = calcVoronoi(ps, { withFinder: true })
r = o.funFindIn({ x: 1151, y: 371, ext: 'abc' })
console.log(r)
// => 8
r = o.funFindIn({ x: 1071, y: 371 }, { returnPoint: true })
console.log(r)
// => { x: 1151, y: 371, ext:'abc' }
r = o.funFindIn({ x: 1061, y: 371 })
console.log(r)
// => 4
Parameters:
Name Type Attributes Default Description
points Array

輸入二維座標加觀測數據點陣列,為[{x:x1,y:y1,z:z1},{x:x2,y:y2,z:z2},...]點物件之陣列

opt Object <optional>
{}

輸入設定物件,預設{}

Properties
Name Type Attributes Default Description
keyX String <optional>
'x'

輸入點物件之x欄位字串,為座標,預設'x'

keyY String <optional>
'y'

輸入點物件之y欄位字串,為座標,預設'y'

scaleBox Number <optional>
1.1

輸入自動計算外框邊界的x,y上下限放大比例,預設1.1

box Array <optional>
[]

輸入外框邊界,為左上右下的2點座標,若有輸入則強制取消scaleBox,預設[]

withFinder Boolean <optional>
false

輸入是否多回傳查詢x,y座標所在網格函數布林值,預設false

withInst Boolean <optional>
false

輸入是否多回傳D3的Voronoi建構物件布林值,預設false

Returns:

回傳多邊形網格資訊物件,nodes為多邊形網格之節點,polygons為多邊形網格之節點指標,其位置係基於points產生,故順序亦對應points,若發生錯誤則回傳錯誤訊息物件

Type
Object

(static) convertCoordinate(cdFrom, cdTo, ps) → {Array}

Description:
Source:
Example
let ps
let r

//from WGS84
ps = [121, 24]
r = convertCoordinate('WGS84', 'TWD97', ps)
console.log('WGS84', 'to', 'TWD97', r)
// => WGS84 to TWD97 [ 121, 24.000000000000004 ]

ps = [121, 24]
r = convertCoordinate('WGS84', 'TWD67', ps)
console.log('WGS84', 'to', 'TWD67', r)
// => WGS84 to TWD67 [ 120.99185287062672, 24.001775588106096 ]

ps = [121, 24]
r = convertCoordinate('WGS84', 'TWD97TM2', ps)
console.log('WGS84', 'to', 'TWD97TM2', r)
// => WGS84 to TWD97TM2 [ 250000, 2655023.124957118 ]

ps = [121, 24]
r = convertCoordinate('WGS84', 'TWD67TM2', ps)
console.log('WGS84', 'to', 'TWD67TM2', r)
// => WGS84 to TWD67TM2 [ 249171.1063953548, 2655228.969012536 ]

ps = [121, 24]
r = convertCoordinate('WGS84', 'UTMTM6', ps)
console.log('WGS84', 'to', 'UTMTM6', r)
// => WGS84 to UTMTM6 [ 295715.5173190569, 2655913.497631182 ]

//from TWD97
ps = [121, 24.000000000000004]
r = convertCoordinate('TWD97', 'WGS84', ps)
console.log('TWD97', 'to', 'WGS84', r)
// => TWD97 to WGS84 [ 121, 24.000000000000004 ]

ps = [121, 24.000000000000004]
r = convertCoordinate('TWD97', 'TWD67', ps)
console.log('TWD97', 'to', 'TWD67', r)
// => TWD97 to TWD67 [ 120.99185287062672, 24.001775588106103 ]

ps = [121, 24.000000000000004]
r = convertCoordinate('TWD97', 'TWD97TM2', ps)
console.log('TWD97', 'to', 'TWD97TM2', r)
// => TWD97 to TWD97TM2 [ 250000, 2655023.124957118 ]

ps = [121, 24.000000000000004]
r = convertCoordinate('TWD97', 'TWD67TM2', ps)
console.log('TWD97', 'to', 'TWD67TM2', r)
// => TWD97 to TWD67TM2 [ 249171.1063953548, 2655228.9690125366 ]

ps = [121, 24.000000000000004]
r = convertCoordinate('TWD97', 'UTMTM6', ps)
console.log('TWD97', 'to', 'UTMTM6', r)
// => TWD97 to UTMTM6 [ 295715.5173190569, 2655913.4976311824 ]

//from TWD67
ps = [120.99185287062672, 24.001775588106103]
r = convertCoordinate('TWD67', 'WGS84', ps)
console.log('TWD67', 'to', 'WGS84', r)
// => TWD67 to WGS84 [ 120.99999996996448, 24.000000006583658 ]

ps = [120.99185287062672, 24.001775588106103]
r = convertCoordinate('TWD67', 'TWD97', ps)
console.log('TWD67', 'to', 'TWD97', r)
// => TWD67 to TWD97 [ 120.99999996996448, 24.000000006583658 ]

ps = [120.99185287062672, 24.001775588106103]
r = convertCoordinate('TWD67', 'TWD97TM2', ps)
console.log('TWD67', 'to', 'TWD97TM2', r)
// => TWD67 to TWD97TM2 [ 249999.99694413712, 2655023.125686239 ]

ps = [120.99185287062672, 24.001775588106103]
r = convertCoordinate('TWD67', 'TWD67TM2', ps)
console.log('TWD67', 'to', 'TWD67TM2', r)
// => TWD67 to TWD67TM2 [ 249171.1063953548, 2655228.969012536 ]

ps = [120.99185287062672, 24.001775588106103]
r = convertCoordinate('TWD67', 'UTMTM6', ps)
console.log('TWD67', 'to', 'UTMTM6', r)
// => TWD67 to UTMTM6 [ 295715.51731826895, 2655913.4976365822 ]

//from TWD97TM2
ps = [250000, 2655023.124957118]
r = convertCoordinate('TWD97TM2', 'WGS84', ps)
console.log('TWD97TM2', 'to', 'WGS84', r)
// => TWD97TM2 to WGS84 [ 121, 24.000000000000004 ]

ps = [250000, 2655023.124957118]
r = convertCoordinate('TWD97TM2', 'TWD97', ps)
console.log('TWD97TM2', 'to', 'TWD97', r)
// => TWD97TM2 to TWD97 [ 121, 24.000000000000004 ]

ps = [250000, 2655023.124957118]
r = convertCoordinate('TWD97TM2', 'TWD67', ps)
console.log('TWD97TM2', 'to', 'TWD67', r)
// => TWD97TM2 to TWD67 [ 120.99185287062672, 24.001775588106103 ]

ps = [250000, 2655023.124957118]
r = convertCoordinate('TWD97TM2', 'TWD67TM2', ps)
console.log('TWD97TM2', 'to', 'TWD67TM2', r)
// => TWD97TM2 to TWD67TM2 [ 249171.1063953548, 2655228.9690125366 ]

ps = [250000, 2655023.124957118]
r = convertCoordinate('TWD97TM2', 'UTMTM6', ps)
console.log('TWD97TM2', 'to', 'UTMTM6', r)
// => TWD97TM2 to UTMTM6 [ 295715.5173190569, 2655913.4976311824 ]

//from TWD67TM2
ps = [249171.1063953548, 2655228.969012536]
r = convertCoordinate('TWD67TM2', 'WGS84', ps)
console.log('TWD67TM2', 'to', 'WGS84', r)
// => TWD67TM2 to WGS84 [ 120.99999996996448, 24.000000006583658 ]

ps = [249171.1063953548, 2655228.969012536]
r = convertCoordinate('TWD67TM2', 'TWD97', ps)
console.log('TWD67TM2', 'to', 'TWD97', r)
// => TWD67TM2 to TWD97 [ 120.99999996996448, 24.000000006583658 ]

ps = [249171.1063953548, 2655228.969012536]
r = convertCoordinate('TWD67TM2', 'TWD67', ps)
console.log('TWD67TM2', 'to', 'TWD67', r)
// => TWD67TM2 to TWD67 [ 120.99185287062672, 24.001775588106096 ]

ps = [249171.1063953548, 2655228.969012536]
r = convertCoordinate('TWD67TM2', 'TWD97TM2', ps)
console.log('TWD67TM2', 'to', 'TWD97TM2', r)
// => TWD67TM2 to TWD97TM2 [ 249999.99694413712, 2655023.125686239 ]

ps = [249171.1063953548, 2655228.969012536]
r = convertCoordinate('TWD67TM2', 'UTMTM6', ps)
console.log('TWD67TM2', 'to', 'UTMTM6', r)
// => TWD67TM2 to UTMTM6 [ 295715.51731826895, 2655913.4976365822 ]

//from UTMTM6
ps = [295715.5173190569, 2655913.497631182]
r = convertCoordinate('UTMTM6', 'WGS84', ps)
console.log('UTMTM6', 'to', 'WGS84', r)
// => UTMTM6 to WGS84 [ 120.99999997049657, 24.000000006421075 ]

ps = [295715.5173190569, 2655913.497631182]
r = convertCoordinate('UTMTM6', 'TWD97', ps)
console.log('UTMTM6', 'to', 'TWD97', r)
// => UTMTM6 to TWD97 [ 120.99999997049657, 24.000000006421075 ]

ps = [295715.5173190569, 2655913.497631182]
r = convertCoordinate('UTMTM6', 'TWD67', ps)
console.log('UTMTM6', 'to', 'TWD67', r)
// => UTMTM6 to TWD67 [ 120.99185287063509, 24.00177558805831 ]

ps = [295715.5173190569, 2655913.497631182]
r = convertCoordinate('UTMTM6', 'TWD97TM2', ps)
console.log('UTMTM6', 'to', 'TWD97TM2', r)
// =>UTMTM6 to TWD97TM2 [ 249999.99699827324, 2655023.1256682333 ]

ps = [295715.5173190569, 2655913.497631182]
r = convertCoordinate('UTMTM6', 'TWD67TM2', ps)
console.log('UTMTM6', 'to', 'TWD67TM2', r)
// => UTMTM6 to TWD67TM2 [ 249171.10639620616, 2655228.9690072443 ]
Parameters:
Name Type Description
cdFrom String

輸入來源座標系統字串

cdTo String

輸入轉出座標系統字串

ps Array

輸入座標(x,y)陣列

Returns:

回傳轉換之座標陣列

Type
Array

(static) findPointInKpBoxPolygons(p, kpPgs, optopt) → {String}

Description:
  • 判斷點陣列[x,y]或點物件{x,y}是否位於某一多邊形內之字典物件,若有則回傳該物件之鍵名,若無則回傳def值

    Unit Test: Github

Source:
Example
let p
let kpPgs = {
    'pgs1': [
        [0, 0],
        [0, 1],
        [1, 1],
        [1, 0],
        [0, 0],
    ],
}
let b

p = [0.5, 0.5]
b = findPointInKpBoxPolygons(p, kpPgs)
console.log(b)
// => 'pgs1'

p = [1.5, 0.5]
b = findPointInKpBoxPolygons(p, kpPgs)
console.log(b)
// => 'unknow'

p = [1.5, 0.5]
b = findPointInKpBoxPolygons(p, kpPgs, { def: '未知' })
console.log(b)
// => '未知'
Parameters:
Name Type Attributes Default Description
p Array | Object

輸入點陣列或點物件,為[x,y]或{x,y}

kpPgs Object

輸入多邊形字典物件,為{key1:pgs1,key2:pgs2,...keyn:pgsn}

opt Object <optional>
{}

輸入設定物件,預設{}

Properties
Name Type Attributes Default Description
keyX String <optional>
'x'

輸入點物件x座標鍵字串,預設'x'

keyY String <optional>
'y'

輸入點物件y座標鍵字串,預設'y'

supposeType String <optional>
'polygons'

輸入提取模式字串,當數據座標深度為2時,使用polygons代表每個其內多邊形為獨立polygon,若為ringStrings則表示其內多邊形為交錯的ringString(代表聯集與剔除),預設'polygons'

toTurfMultiPolygon Boolean <optional>
true

輸入是否轉換多邊形為Turf的MultiPolygon,若須加速可於外部先轉好就不用於函數內再轉,預設true

def String <optional>
'unknow'

輸入若點未位於任一多邊形時,回傳指定名稱字串,預設'unknow'

Returns:

回傳名稱字串

Type
String

(static) findPointInKpFeature(p, kpFt, optopt) → {String}

Description:
  • 判斷點陣列[x,y]或點物件{x,y}是否位於某一特徵(Feature)內之字典物件,若有則回傳該特徵之鍵名,若無則回傳def值

    Unit Test: Github

Source:
Example
let p
let kpFt = {
    ft1: {
        'type': 'Feature',
        'properties': {
            'name': 'pgs1',
        },
        'geometry': {
            'type': 'MultiPolygon',
            'coordinates': [
                [
                    [
                        [0, 0],
                        [0, 1],
                        [1, 1],
                        [1, 0],
                        [0, 0],
                    ]
                ]
            ]
        }
    },
    ft2: {
        'type': 'Feature',
        'properties': {
            'name': 'pgs2',
        },
        'geometry': {
            'type': 'MultiPolygon',
            'coordinates': [
                [
                    [
                        [1, 1],
                        [1, 2],
                        [2, 2],
                        [2, 1],
                        [1, 1],
                    ]
                ]
            ]
        }
    },
}
let b

p = [0.5, 0.5]
b = findPointInKpFeature(p, kpFt)
console.log(b)
// => 'ft1'

p = [1.5, 0.5]
kpFt = {
    'ft1': [
        [0, 0],
        [0, 1],
        [1, 1],
        [1, 0],
        [0, 0],
    ],
}
b = findPointInKpFeature(p, kpFt)
console.log(b)
// => 'unknow'

p = [1.5, 0.5]
kpFt = {
    'ft1': [
        [0, 0],
        [0, 1],
        [1, 1],
        [1, 0],
        [0, 0],
    ],
}
b = findPointInKpFeature(p, kpFt, { def: '未知' })
console.log(b)
// => '未知'
Parameters:
Name Type Attributes Default Description
p Array | Object

輸入點陣列或點物件,為[x,y]或{x,y}

kpFt Object

輸入字典物件,為{key1:ft1,key2:ft2,...keyn:ftn}

opt Object <optional>
{}

輸入設定物件,預設{}

Properties
Name Type Attributes Default Description
keyX String <optional>
'x'

輸入點物件x座標鍵字串,預設'x'

keyY String <optional>
'y'

輸入點物件y座標鍵字串,預設'y'

supposeType String <optional>
'polygons'

輸入提取模式字串,當數據座標深度為2時,使用polygons代表每個其內多邊形為獨立polygon,若為ringStrings則表示其內多邊形為交錯的ringString(代表聯集與剔除),預設'polygons'

def String <optional>
'unknow'

輸入若點未位於任一多邊形時,回傳指定名稱字串,預設'unknow'

Returns:

回傳名稱字串

Type
String

(static) findPointInKpPolygons(p, kpPgs, optopt) → {String}

Description:
  • 判斷點陣列[x,y]或點物件{x,y}是否位於某一多邊形內之字典物件,若有則回傳該物件之鍵名,若無則回傳def值

    Unit Test: Github

Source:
Example
let p
let kpPgs = {
    'pgs1': [
        [0, 0],
        [0, 1],
        [1, 1],
        [1, 0],
        [0, 0],
    ],
}
let b

p = [0.5, 0.5]
b = findPointInKpPolygons(p, kpPgs)
console.log(b)
// => 'pgs1'

p = [1.5, 0.5]
b = findPointInKpPolygons(p, kpPgs)
console.log(b)
// => 'unknow'

p = [1.5, 0.5]
b = findPointInKpPolygons(p, kpPgs, { def: '未知' })
console.log(b)
// => '未知'
Parameters:
Name Type Attributes Default Description
p Array | Object

輸入點陣列或點物件,為[x,y]或{x,y}

kpPgs Object

輸入多邊形字典物件,為{key1:pgs1,key2:pgs2,...keyn:pgsn}

opt Object <optional>
{}

輸入設定物件,預設{}

Properties
Name Type Attributes Default Description
keyX String <optional>
'x'

輸入點物件x座標鍵字串,預設'x'

keyY String <optional>
'y'

輸入點物件y座標鍵字串,預設'y'

supposeType String <optional>
'polygons'

輸入提取模式字串,當數據座標深度為2時,使用polygons代表每個其內多邊形為獨立polygon,若為ringStrings則表示其內多邊形為交錯的ringString(代表聯集與剔除),預設'polygons'

toTurfMultiPolygon Boolean <optional>
true

輸入是否轉換多邊形為Turf的MultiPolygon,若須加速可於外部先轉好就不用於函數內再轉,預設true

def String <optional>
'unknow'

輸入若點未位於任一多邊形時,回傳指定名稱字串,預設'unknow'

Returns:

回傳名稱字串

Type
String

(static) fixCloseMultiPolygon(pgs, optopt) → {Array}

Description:
  • 修復MultiPolygon內各RingString為閉合

    Unit Test: Github

Source:
Example
let pgs
let r

pgs = [ //ringString
    [0, 0],
    [100, 0],
    [100, 1],
    [0, 1],
    [0, 0], //閉合
]
r = fixCloseMultiPolygon(pgs)
console.log(JSON.stringify(r))
// => [[[[0,0],[100,0],[100,1],[0,1],[0,0]]]]

pgs = [ //ringString
    [0, 0],
    [100, 0],
    [100, 1],
    [0, 1],
]
r = fixCloseMultiPolygon(pgs)
console.log(JSON.stringify(r))
// => [[[[0,0],[100,0],[100,1],[0,1],[0,0]]]]

pgs = [ //polygon
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ]
]
r = fixCloseMultiPolygon(pgs)
console.log(JSON.stringify(r))
// => [[[[0,0],[100,0],[100,1],[0,1],[0,0]]]]

pgs = [ //polygon
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = fixCloseMultiPolygon(pgs)
console.log(JSON.stringify(r))
// => [[[[0,0],[10,0],[10,1],[0,1],[0,0]]]]

pgs = [ //polygon
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ],
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = fixCloseMultiPolygon(pgs) //預設polygon轉multiPolygon使用視為polygons, 故其內會是2個polygons
console.log(JSON.stringify(r))
// => [[[[0,0],[100,0],[100,1],[0,1],[0,0]]],[[[0,0],[10,0],[10,1],[0,1],[0,0]]]]

pgs = [ //polygon
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ],
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = fixCloseMultiPolygon(pgs, { supposeType: 'ringStrings' }) //polygon轉multiPolygon使用ringStrings
console.log(JSON.stringify(r))
// => [[[[0,0],[100,0],[100,1],[0,1],[0,0]],[[0,0],[10,0],[10,1],[0,1],[0,0]]]]

pgs = [ //multiPolygon
    [
        [
            [0, 0],
            [100, 0],
            [100, 1],
            [0, 1],
        ],
        [
            [0, 0],
            [10, 0],
            [10, 1],
            [0, 1],
        ]
    ]
]
r = fixCloseMultiPolygon(pgs)
console.log(JSON.stringify(r))
// => [[[[0,0],[100,0],[100,1],[0,1],[0,0]],[[0,0],[10,0],[10,1],[0,1],[0,0]]]]
Parameters:
Name Type Attributes Default Description
pgs Array

輸入Polygon資料陣列,為[ [[x11,y11],[x12,y12],...], [[x21,y21],[x22,y22],...] ]Polygon構成之陣列

opt Object <optional>
{}

輸入設定物件,預設{}

Properties
Name Type Attributes Default Description
supposeType String <optional>
'polygons'

輸入提取模式字串,當數據座標深度為2時,使用polygons代表每個其內多邊形為獨立polygon,若為ringStrings則表示其內多邊形為交錯的ringString(代表聯集與剔除),預設'polygons'

Returns:

回傳形心座標陣列

Type
Array

(static) fixNoCloseMultiPolygon(pgs, optopt) → {Array}

Description:
  • 修復MultiPolygon內各RingString為非閉合

    Unit Test: Github

Source:
Example
let pgs
let r

pgs = [ //ringString
    [0, 0],
    [100, 0],
    [100, 1],
    [0, 1],
    [0, 0], //閉合
]
r = fixNoCloseMultiPolygon(pgs)
console.log(JSON.stringify(r))
// => [[[[0,0],[100,0],[100,1],[0,1]]]]

pgs = [ //ringString
    [0, 0],
    [100, 0],
    [100, 1],
    [0, 1],
]
r = fixNoCloseMultiPolygon(pgs)
console.log(JSON.stringify(r))
// => [[[[0,0],[100,0],[100,1],[0,1]]]]

pgs = [ //polygon
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ]
]
r = fixNoCloseMultiPolygon(pgs)
console.log(JSON.stringify(r))
// => [[[[0,0],[100,0],[100,1],[0,1]]]]

pgs = [ //polygon
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = fixNoCloseMultiPolygon(pgs)
console.log(JSON.stringify(r))
// => [[[[0,0],[10,0],[10,1],[0,1]]]]

pgs = [ //polygon
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ],
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = fixNoCloseMultiPolygon(pgs) //預設polygon轉multiPolygon使用視為polygons, 故其內會是2個polygons
console.log(JSON.stringify(r))
// => [[[[0,0],[100,0],[100,1],[0,1]]],[[[0,0],[10,0],[10,1],[0,1]]]]

pgs = [ //polygon
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
        [0, 0],
    ],
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = fixNoCloseMultiPolygon(pgs, { supposeType: 'ringStrings' }) //polygon轉multiPolygon使用ringStrings
console.log(JSON.stringify(r))
// => [[[[0,0],[100,0],[100,1],[0,1]],[[0,0],[10,0],[10,1],[0,1]]]]

pgs = [ //multiPolygon
    [
        [
            [0, 0],
            [100, 0],
            [100, 1],
            [0, 1],
        ],
        [
            [0, 0],
            [10, 0],
            [10, 1],
            [0, 1],
            [0, 0],
        ]
    ]
]
r = fixNoCloseMultiPolygon(pgs)
console.log(JSON.stringify(r))
// => [[[[0,0],[100,0],[100,1],[0,1]],[[0,0],[10,0],[10,1],[0,1]]]]
Parameters:
Name Type Attributes Default Description
pgs Array

輸入Polygon資料陣列,為[ [[x11,y11],[x12,y12],...], [[x21,y21],[x22,y22],...] ]Polygon構成之陣列

opt Object <optional>
{}

輸入設定物件,預設{}

Properties
Name Type Attributes Default Description
supposeType String <optional>
'polygons'

輸入提取模式字串,當數據座標深度為2時,使用polygons代表每個其內多邊形為獨立polygon,若為ringStrings則表示其內多邊形為交錯的ringString(代表聯集與剔除),預設'polygons'

Returns:

回傳形心座標陣列

Type
Array

(static) getAreaMultiPolygon(pgs, optopt) → {Number}

Description:
  • 計算MultiPolygon面積 得要考慮多區域、剔除區域之組合: http://esri.github.io/geometry-api-java/doc/Polygon.html

    Unit Test: Github

Source:
Example
let pgs
let r

pgs = [ //ringString
    [0, 0],
    [100, 0],
    [100, 1],
    [0, 1],
    [0, 0], //閉合
]
r = getAreaMultiPolygon(pgs)
console.log(r)
// => 100

pgs = [ //ringString
    [0, 0],
    [100, 0],
    [100, 1],
    [0, 1],
]
r = getAreaMultiPolygon(pgs)
console.log(r)
// => 100

pgs = [ //polygon
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ]
]
r = getAreaMultiPolygon(pgs)
console.log(r)
// => 100

pgs = [ //polygon
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = getAreaMultiPolygon(pgs)
console.log(r)
// => 10

pgs = [ //polygon
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ],
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = getAreaMultiPolygon(pgs) //預設polygon轉multiPolygon使用視為polygons, 故其內會是2個polygons故面積直接加總
console.log(r)
// => 110

pgs = [ //polygon
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ],
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = getAreaMultiPolygon(pgs, { supposeType: 'ringStrings' }) //polygon轉multiPolygon使用ringStrings
console.log(r)
// => 90

pgs = [ //multiPolygon
    [
        [
            [0, 0],
            [100, 0],
            [100, 1],
            [0, 1],
        ],
        [
            [0, 0],
            [10, 0],
            [10, 1],
            [0, 1],
        ]
    ]
]
r = getAreaMultiPolygon(pgs)
console.log(r)
// => 90
Parameters:
Name Type Attributes Default Description
pgs Array

輸入Polygon資料陣列,為[ [[x11,y11],[x12,y12],...], [[x21,y21],[x22,y22],...] ]Polygon構成之陣列

opt Object <optional>
{}

輸入設定物件,預設{}

Properties
Name Type Attributes Default Description
supposeType String <optional>
'polygons'

輸入提取模式字串,當數據座標深度為2時,使用polygons代表每個其內多邊形為獨立polygon,若為ringStrings則表示其內多邊形為交錯的ringString(代表聯集與剔除),預設'polygons'

Returns:

回傳面積數字

Type
Number

(static) getAreaMultiPolygonSm(pgs, optopt) → {Number}

Description:
  • 計算MultiPolygon面積,輸入各點為經緯度座標,輸出為平方公尺面積

    Unit Test: Github

Source:
Example
let pgs
let r

pgs = [ //ringString
    [121, 23],
    [122, 23],
    [122, 24],
    [121, 24],
    [121, 23], //閉合
]
r = getAreaMultiPolygonSm(pgs)
console.log(r)
// => 11364090825.686134

pgs = [ //ringString
    [121, 23],
    [122, 23],
    [122, 24],
    [121, 24],
]
r = getAreaMultiPolygonSm(pgs)
console.log(r)
// => 11364090825.686134

pgs = [ //polygon
    [
        [121, 23],
        [122, 23],
        [122, 24],
        [121, 24],
    ]
]
r = getAreaMultiPolygonSm(pgs)
console.log(r)
// => 11364090825.686134

pgs = [ //polygon
    [
        [121, 23],
        [121.5, 23],
        [121.5, 24],
        [121, 24],
    ]
]
r = getAreaMultiPolygonSm(pgs)
console.log(r)
// => 5682045412.843067

pgs = [ //polygon
    [
        [121, 23],
        [122, 23],
        [122, 24],
        [121, 24],
    ],
    [
        [121, 23],
        [121.5, 23],
        [121.5, 24],
        [121, 24],
    ]
]
r = getAreaMultiPolygonSm(pgs) //預設polygon轉multiPolygon使用視為polygons, 故其內會是2個polygons故面積直接加總
console.log(r)
// => 17046136238.529202

pgs = [ //polygon
    [
        [121, 23],
        [122, 23],
        [122, 24],
        [121, 24],
    ],
    [
        [121, 23],
        [121.5, 23],
        [121.5, 24],
        [121, 24],
    ]
]
r = getAreaMultiPolygonSm(pgs, { supposeType: 'ringStrings' }) //polygon轉multiPolygon使用ringStrings, 但turf計算時只取最後ringString計算面積
console.log(r)
// => 5682045412.843067

pgs = [ //multiPolygon
    [
        [
            [121, 23],
            [122, 23],
            [122, 24],
            [121, 24],
        ],
        [
            [121, 23],
            [121.5, 23],
            [121.5, 24],
            [121, 24],
        ]
    ]
]
r = getAreaMultiPolygonSm(pgs) //turf計算時只取最後ringString計算面積
console.log(r)
// => 5682045412.843067
Parameters:
Name Type Attributes Default Description
pgs Array

輸入Polygon資料陣列,為[ [[x11,y11],[x12,y12],...], [[x21,y21],[x22,y22],...] ]Polygon構成之陣列

opt Object <optional>
{}

輸入設定物件,預設{}

Properties
Name Type Attributes Default Description
supposeType String <optional>
'polygons'

輸入提取模式字串,當數據座標深度為2時,使用polygons代表每個其內多邊形為獨立polygon,若為ringStrings則表示其內多邊形為交錯的ringString(代表聯集與剔除),預設'polygons'

Returns:

回傳面積數字,單位為m2

Type
Number

(static) getAreaPolygon(pg) → {Number}

Description:
  • 計算Polygon面積 得要考慮多區域、剔除區域之組合: http://esri.github.io/geometry-api-java/doc/Polygon.html

    Unit Test: Github

Source:
Example
let pg
let r

pg = [
    [0, 0],
    [100, 0],
    [100, 1],
    [0, 1],
    [0, 0], //閉合
]
r = getAreaPolygon(pg)
console.log(r)
// => 100

pg = [
    [0, 0],
    [100, 0],
    [100, 1],
    [0, 1],
]
r = getAreaPolygon(pg)
console.log(r)
// => 100

pg = [
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ]
]
r = getAreaPolygon(pg)
console.log(r)
// => 100

pg = [
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = getAreaPolygon(pg)
console.log(r)
// => 10

pg = [
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ],
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = getAreaPolygon(pg)
console.log(r)
// => 90

pg = [
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ],
    [ //第 2 RingString 與第 1 RingString 不重疊, 但polygon第1個為主要區, 其後為剔除區, 此為有問題多邊形
        [200, 0],
        [210, 0],
        [210, 1],
        [200, 1],
    ]
]
r = getAreaPolygon(pg)
console.log(r)
// => 90, 實際為110
Parameters:
Name Type Description
pg Array

輸入Polygon資料陣列,為[[x1,y1],[x2,y2],...]RingString構成之陣列

Returns:

回傳面積數字

Type
Number

(static) getAreaRingString(rs, optopt) → {Number}

Description:
  • 計算RingString面積

    Unit Test: Github

Source:
Example
let rs
let r

rs = [
    [0, 0],
    [100, 0],
    [100, 1],
    [0, 1],
    [0, 0], //閉合
]
r = getAreaRingString(rs)
console.log(r)
// => 100

rs = [
    [0, 0],
    [100, 0],
    [100, 1],
    [0, 1],
]
r = getAreaRingString(rs)
console.log(r)
// => 100

rs = [
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ]
]
r = getAreaRingString(rs)
console.log(r)
// => 0
Parameters:
Name Type Attributes Default Description
rs Array

輸入RingString資料陣列,為[x,y]點構成之陣列

opt Object <optional>
{}

輸入設定物件,預設{}

Properties
Name Type Attributes Default Description
useAbs Boolean <optional>
true

輸入面積是否取絕對值,預設true

Returns:

回傳面積數字

Type
Number

(static) getBox(fts) → {Object}

Description:
  • 計算點、線、面陣列之外接矩形範圍

    Unit Test: Github

Source:
Example
let pgs
let r

pgs = [ //ringString
    [0, 0],
    [100, 0],
    [100, 1],
    [0, 1],
    [0, 0], //閉合
]
r = getBox(pgs)
console.log(JSON.stringify(r))
// => {"xmin":0,"ymin":0,"xmax":100,"ymax":1}

pgs = [ //ringString
    [0, 0],
    [100, 0],
    [100, 1],
    [0, 1],
]
r = getBox(pgs)
console.log(JSON.stringify(r))
// => {"xmin":0,"ymin":0,"xmax":100,"ymax":1}

pgs = [ //polygon
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ]
]
r = getBox(pgs)
console.log(JSON.stringify(r))
// => {"xmin":0,"ymin":0,"xmax":100,"ymax":1}

pgs = [ //polygon
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = getBox(pgs)
console.log(JSON.stringify(r))
// => {"xmin":0,"ymin":0,"xmax":10,"ymax":1}

pgs = [ //polygon
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ],
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = getBox(pgs)
console.log(JSON.stringify(r))
// => {"xmin":0,"ymin":0,"xmax":100,"ymax":1}

pgs = [ //multiPolygon
    [
        [
            [0, 0],
            [100, 0],
            [100, 1],
            [0, 1],
        ],
        [
            [0, 0],
            [10, 0],
            [10, 1],
            [0, 1],
        ],
        [
            [0, 0],
            [-10, 0],
            [-10, 123],
            [0, 1],
        ]
    ]
]
r = getBox(pgs)
console.log(JSON.stringify(r))
// => {"xmin":-10,"ymin":0,"xmax":100,"ymax":123}
Parameters:
Name Type Description
fts Array

輸入資料陣列,為多點(multiPoint)、線(line)、多線(multiLine)、面(polygon)、多面(multiPolygon)數據陣列

Returns:

回傳外接矩形範圍物件

Type
Object

(static) getBoxFromGeojson(geojson, optopt) → {Object}

Description:
  • 計算Geojson的點、線、面陣列之外接矩形範圍

    Unit Test: Github

Source:
Example
let geojson
let r

geojson = {
    'type': 'FeatureCollection',
    'name': 'pgs',
    'features': [
        {
            'type': 'Feature',
            'properties': {
                'name': 'pgs1',
            },
            'geometry': {
                'type': 'MultiPolygon',
                'coordinates': [
                    [
                        [
                            [0, 0],
                            [0, 1],
                            [1, 1],
                            [1, 0],
                            [0, 0],
                        ]
                    ]
                ]
            }
        },
        {
            'type': 'Feature',
            'properties': {
                'name': 'pgs2',
            },
            'geometry': {
                'type': 'MultiPolygon',
                'coordinates': [
                    [
                        [
                            [1, 1],
                            [1, 2],
                            [2, 2],
                            [2, 1],
                            [1, 1],
                        ]
                    ]
                ]
            }
        },
    ]
}
r = getBoxFromGeojson(geojson)
console.log(r)
// => { xmin: 0, xmax: 2, ymin: 0, ymax: 2 }

geojson = {
    'type': 'Feature',
    'properties': {},
    'geometry': {
        'type': 'MultiPolygon',
        'coordinates': {
            'type': 'Feature',
            'properties': {
                'name': 'pgs',
            },
            'geometry': {
                'type': 'MultiPolygon',
                'coordinates': [
                    [
                        [
                            [0, 0],
                            [-0.2, 1],
                            [1, 1.1],
                            [1, 0],
                            [0, 0],
                        ]
                    ]
                ]
            }
        }
    }
}
r = getBoxFromGeojson(geojson)
console.log(r)
// => { xmin: -0.2, xmax: 1, ymin: 0, ymax: 1.1 }
Parameters:
Name Type Attributes Default Description
geojson Array

輸入資料陣列,為多點(multiPoint)、線(line)、多線(multiLine)、面(polygon)、多面(multiPolygon)數據陣列

opt Object <optional>
{}

輸入設定物件,預設{}

Properties
Name Type Attributes Default Description
toTurfMultiPolygon Boolean <optional>
true

輸入是否轉換多邊形為Turf的MultiPolygon,若須加速可於外部先轉好就不用於函數內再轉,預設true

Returns:

回傳外接矩形範圍物件

Type
Object

(static) getBoxPolygon(fts) → {Array}

Description:
  • 計算點、線、面陣列之外接矩形並轉出polygon陣列

    Unit Test: Github

Source:
Example
let pgs
let r

pgs = [ //ringString
    [0, 0],
    [100, 0],
    [100, 1],
    [0, 1],
    [0, 0], //閉合
]
r = getBoxPolygon(pgs)
console.log(r)
// => [ [ 0, 0 ], [ 100, 0 ], [ 100, 1 ], [ 0, 1 ], [ 0, 0 ] ]

pgs = [ //ringString
    [0, 0],
    [100, 0],
    [100, 1],
    [0, 1],
]
r = getBoxPolygon(pgs)
console.log(r)
// => [ [ 0, 0 ], [ 100, 0 ], [ 100, 1 ], [ 0, 1 ], [ 0, 0 ] ]

pgs = [ //polygon
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ]
]
r = getBoxPolygon(pgs)
console.log(r)
// => [ [ 0, 0 ], [ 100, 0 ], [ 100, 1 ], [ 0, 1 ], [ 0, 0 ] ]

pgs = [ //polygon
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = getBoxPolygon(pgs)
console.log(r)
// => [ [ 0, 0 ], [ 10, 0 ], [ 10, 1 ], [ 0, 1 ], [ 0, 0 ] ]

pgs = [ //polygon
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ],
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = getBoxPolygon(pgs)
console.log(r)
// => [ [ 0, 0 ], [ 100, 0 ], [ 100, 1 ], [ 0, 1 ], [ 0, 0 ] ]

pgs = [ //multiPolygon
    [
        [
            [0, 0],
            [100, 0],
            [100, 1],
            [0, 1],
        ],
        [
            [0, 0],
            [10, 0],
            [10, 1],
            [0, 1],
        ],
        [
            [0, 0],
            [-10, 0],
            [-10, 123],
            [0, 1],
        ]
    ]
]
r = getBoxPolygon(pgs)
console.log(r)
// => [ [ -10, 0 ], [ 100, 0 ], [ 100, 123 ], [ -10, 123 ], [ -10, 0 ] ]
Parameters:
Name Type Description
fts Array

輸入資料陣列,為多點(multiPoint)、線(line)、多線(multiLine)、面(polygon)、多面(multiPolygon)數據陣列

Returns:

回傳polygon陣列

Type
Array

(static) getCenterOfMassMultiPolygon(pgs, optopt) → {Number}

Description:
  • 計算MultiPolygon質心座標

    Unit Test: Github

Source:
Example
let pgs
let r

pgs = [ //ringString
    [0, 0],
    [100, 0],
    [100, 1],
    [0, 1],
    [0, 0], //閉合
]
r = getCenterOfMassMultiPolygon(pgs)
console.log(JSON.stringify(r))
// => [50,0.5]

pgs = [ //ringString
    [0, 0],
    [100, 0],
    [100, 1],
    [0, 1],
]
r = getCenterOfMassMultiPolygon(pgs)
console.log(JSON.stringify(r))
// => [50,0.5]

pgs = [ //polygon
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ]
]
r = getCenterOfMassMultiPolygon(pgs)
console.log(JSON.stringify(r))
// => [50,0.5]

pgs = [ //polygon
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = getCenterOfMassMultiPolygon(pgs)
console.log(JSON.stringify(r))
// => [5,0.5]

pgs = [ //polygon
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ],
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = getCenterOfMassMultiPolygon(pgs) //預設polygon轉multiPolygon使用視為polygons, 故其內會是2個polygons
console.log(JSON.stringify(r))
// => [50,0.5] //非2個ringString共構的polygon質心, 僅計算第1個

pgs = [ //polygon
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ],
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = getCenterOfMassMultiPolygon(pgs, { supposeType: 'ringStrings' }) //polygon轉multiPolygon使用ringStrings
console.log(JSON.stringify(r))
// => [50,0.5] //非第1個ringString剔除第2個ringString的質心, 僅計算第1個

pgs = [ //multiPolygon
    [
        [
            [0, 0],
            [100, 0],
            [100, 1],
            [0, 1],
        ],
        [
            [0, 0],
            [10, 0],
            [10, 1],
            [0, 1],
        ]
    ]
]
r = getCenterOfMassMultiPolygon(pgs)
console.log(JSON.stringify(r))
// => [50,0.5] //非第1個ringString剔除第2個ringString的質心, 僅計算第1個
Parameters:
Name Type Attributes Default Description
pgs Array

輸入Polygon資料陣列,為[ [[x11,y11],[x12,y12],...], [[x21,y21],[x22,y22],...] ]Polygon構成之陣列

opt Object <optional>
{}

輸入設定物件,預設{}

Properties
Name Type Attributes Default Description
supposeType String <optional>
'polygons'

輸入提取模式字串,當數據座標深度為2時,使用polygons代表每個其內多邊形為獨立polygon,若為ringStrings則表示其內多邊形為交錯的ringString(代表聯集與剔除),預設'polygons'

Returns:

回傳面積數字

Type
Number

(static) getCentroidMultiPolygon(pgs, optopt) → {Array}

Description:
  • 計算MultiPolygon形心座標

    Unit Test: Github

Source:
Example
let pgs
let r

pgs = [ //ringString
    [0, 0],
    [100, 0],
    [100, 1],
    [0, 1],
    [0, 0], //閉合
]
r = getCentroidMultiPolygon(pgs)
console.log(JSON.stringify(r))
// => [50,0.5]

pgs = [ //ringString
    [0, 0],
    [100, 0],
    [100, 1],
    [0, 1],
]
r = getCentroidMultiPolygon(pgs)
console.log(JSON.stringify(r))
// => [50,0.5]

pgs = [ //polygon
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ]
]
r = getCentroidMultiPolygon(pgs)
console.log(JSON.stringify(r))
// => [50,0.5]

pgs = [ //polygon
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = getCentroidMultiPolygon(pgs)
console.log(JSON.stringify(r))
// => [5,0.5]

pgs = [ //polygon
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ],
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = getCentroidMultiPolygon(pgs) //預設polygon轉multiPolygon使用視為polygons, 故其內會是2個polygons
console.log(JSON.stringify(r))
// => [27.5,0.5] //非2個ringString共構的polygon形心
console.log('(50*10+5*1)/11', (50 * 10 + 5 * 1) / 11)
// => (50*10+5*1)/11 45.90909090909091

pgs = [ //polygon
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ],
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = getCentroidMultiPolygon(pgs, { supposeType: 'ringStrings' }) //polygon轉multiPolygon使用ringStrings
console.log(JSON.stringify(r))
// => [27.5,0.5] //非第1個ringString剔除第2個ringString的形心

pgs = [ //multiPolygon
    [
        [
            [0, 0],
            [100, 0],
            [100, 1],
            [0, 1],
        ],
        [
            [0, 0],
            [10, 0],
            [10, 1],
            [0, 1],
        ]
    ]
]
r = getCentroidMultiPolygon(pgs)
console.log(JSON.stringify(r))
// => [27.5,0.5] //非第1個ringString剔除第2個ringString的形心
Parameters:
Name Type Attributes Default Description
pgs Array

輸入Polygon資料陣列,為[ [[x11,y11],[x12,y12],...], [[x21,y21],[x22,y22],...] ]Polygon構成之陣列

opt Object <optional>
{}

輸入設定物件,預設{}

Properties
Name Type Attributes Default Description
supposeType String <optional>
'polygons'

輸入提取模式字串,當數據座標深度為2時,使用polygons代表每個其內多邊形為獨立polygon,若為ringStrings則表示其內多邊形為交錯的ringString(代表聯集與剔除),預設'polygons'

Returns:

回傳形心座標陣列

Type
Array

(static) getKpFeatureFromGeojson(geojson, optopt) → {Object}

Description:
  • 由geojson內features提取指定key做鍵之字典物件

    Unit Test: Github

Source:
Example
let geojson
let kp

geojson = `
{
    'type': 'FeatureCollection',
    'name': 'pgs',
    'features': [
        {
            'type': 'Feature',
            'properties': {
                'name': 'pgs1',
            },
            'geometry': {
                'type': 'MultiPolygon',
                'coordinates': [
                    [
                        [
                            [0, 0],
                            [0, 1],
                            [1, 1],
                            [1, 0],
                            [0, 0],
                        ]
                    ]
                ]
            }
        },
        {
            'type': 'Feature',
            'properties': {
                'name': 'pgs2',
            },
            'geometry': {
                'type': 'MultiPolygon',
                'coordinates': [
                    [
                        [
                            [1, 1],
                            [1, 2],
                            [2, 2],
                            [2, 1],
                            [1, 1],
                        ]
                    ]
                ]
            }
        },
    ]
}
`

kp = getKpFeatureFromGeojson(geojson, { keysPick: 'properties.name' })
console.log(kp)
// => {
//   pgs1: {
//     type: 'Feature',
//     properties: { name: 'pgs1' },
//     geometry: { type: 'MultiPolygon', coordinates: [Array] }
//   },
//   pgs2: {
//     type: 'Feature',
//     properties: { name: 'pgs2' },
//     geometry: { type: 'MultiPolygon', coordinates: [Array] }
//   }
// }
Parameters:
Name Type Attributes Default Description
geojson String | Object

輸入geojson字串或物件

opt Object <optional>
{}

輸入設定物件,預設{}

Properties
Name Type Attributes Default Description
keyFeatures String <optional>
'geometry.coordinates.features'

輸入geojson轉換至Turf的MultiPolygon物件時,取得Features數據之鍵名路徑字串,預設'geometry.coordinates.features'

keysPick Array | String <optional>
[]

輸入由特徵取得做為鍵名之路徑字串,預設[]

sepKeysPick String <optional>
'|'

輸入由keysPick取得多鍵名之組裝用分隔字串,預設'|'

def String <optional>
'unknow'

輸入回傳預設鍵名字串,代表features內找不到opt.key則使用opt.def做鍵名,而若有多個找不到情形則複寫處理,也就是取最末者。預設'unknow'

Returns:

回傳字典物件

Type
Object

(static) interp1(ps, x, optopt) → {Number|Object}

Description:
  • 針對不規則一維數據進行指定內插點數值

Source:
Example
async function test() {

    let ps
    let p
    let r

    ps = [{ x: 243, y: 206 }, { x: 233, y: 225 }, { x: 21, y: 325 }, { x: 953, y: 28 }, { x: 1092, y: 290 }, { x: 744, y: 200 }, { x: 174, y: 3 }, { x: 537, y: 368 }, { x: 1151, y: 371 }, { x: 814, y: 252 }]
    p = {
        x: 243,
    }
    r = await interp1(ps, p)
    console.log(r)
    // => { x: 243, y: 206 }

    ps = [{ x: 243, y: 206 }, { x: 233, y: 225 }, { x: 21, y: 325 }, { x: 953, y: 28 }, { x: 1092, y: 290 }, { x: 744, y: 200 }, { x: 174, y: 3 }, { x: 537, y: 368 }, { x: 1151, y: 371 }, { x: 814, y: 252 }]
    p = {
        x: 283,
    }
    r = await interp1(ps, p)
    console.log(r)
    // => { x: 283, y: 228.0408163265306 }

    ps = [{ x: 243, y: 206 }, { x: 233, y: 225 }, { x: 21, y: 325 }, { x: 953, y: 28 }, { x: 1092, y: 290 }, { x: 744, y: 200 }, { x: 174, y: 3 }, { x: 537, y: 368 }, { x: 1151, y: 371 }, { x: 814, y: 252 }]
    p = {
        x: 1160,
    }
    r = await interp1(ps, p)
    console.log(r)
    // => { x: 1160, y: null }

    ps = [{ a: 243, b: 206 }, { a: 233, b: 225 }, { a: 21, b: 325 }, { a: 953, b: 28 }, { a: 1092, b: 290 }, { a: 744, b: 200 }, { a: 174, b: 3 }, { a: 537, b: 368 }, { a: 1151, b: 371 }, { a: 814, b: 252 }]
    p = {
        a: 243,
    }
    r = await interp1(ps, p, { keyX: 'a', keyY: 'b' })
    console.log(r)
    // => { a: 243, b: 206 }

    ps = [{ x: 243, y: 206 }, { x: 233, y: 225 }, { x: 21, y: 325 }, { x: 953, y: 28 }, { x: 1092, y: 290 }, { x: 744, y: 200 }, { x: 174, y: 3 }, { x: 537, y: 368 }, { x: 1151, y: 371 }, { x: 814, y: 252 }]
    p = [
        {
            x: 243,
        },
        {
            x: 283,
        },
    ]
    r = await interp1(ps, p)
    console.log(r)
    // => [ { x: 243, y: 206 }, { x: 283, y: 228.0408163265306 } ]

    ps = [{ x: 0.000243, y: 0.000206 }, { x: 0.000233, y: 0.000225 }, { x: 0.000021, y: 0.000325 }, { x: 0.000953, y: 0.000028 }, { x: 0.001092, y: 0.00029 }, { x: 0.000744, y: 0.000200 }, { x: 0.000174, y: 0.000003 }, { x: 0.000537, y: 0.000368 }, { x: 0.001151, y: 0.000371 }, { x: 0.000814, y: 0.000252 }]
    p = {
        x: 0.000243,
    }
    r = await interp1(ps, p)
    console.log(r)
    // => { x: 0.000243, y: 0.00020600000000000002 }

    ps = [{ x: 243, y: 206 }, { x: 233, y: 225 }, { x: 21, y: 325 }, { x: 953, y: 28 }, { x: 1092, y: 290 }, { x: 744, y: 200 }, { x: 174, y: 3 }, { x: 537, y: 368 }, { x: 1151, y: 371 }, { x: 814, y: 252 }]
    p = {
        x: 243,
    }
    r = interp1(ps, p, { useSync: true }) //使用interp2.wk.umd.js則不支援sync模式
    console.log(r)
    // => { x: 243, y: 206 }

}
test()
    .catch((err) => {
        console.log(err)
    })
Parameters:
Name Type Attributes Default Description
ps Array

輸入一維數據,格式可支援兩種,第一種各點為陣列[[x1,y1],[x2,y2],...],例如[[0.1,5],[0.2,12],...],第二種各點為物件,屬性至少要有x與y,格式為[{x:x1,y:y1},{x:x2,y:y2},...],例如[{x:0.1,y:5},{x:0.2,y:12},...],key值x與y可由opt更換

x Number

輸入要內插點的x值

opt Object <optional>
{}

輸入設定物件,預設{}

Properties
Name Type Attributes Default Description
method String <optional>
''

輸入內插方法,可選'linear'、'stairs'、'blocks',預設'linear'

keyX String <optional>
'x'

輸入若數據為物件陣列,取物件x值時的key字串,預設為'x'

keyY String <optional>
'y'

輸入若數據為物件陣列,取物件y值時的key字串,預設為'y'

xMin Number <optional>

輸入若mode='stairs',更改x範圍下限值,預設為undefined

xMax Number <optional>

輸入若mode='stairs',更改x範圍上限值,預設為undefined

Returns:

回傳內插結果數值,或是無法內插時之錯誤訊息物件

Type
Number | Object

(static) interp2(psSrc, psTar, optopt) → {Promise|Array|Object}

Description:
  • 針對不規則二維數據進行指定內插點數值

    Unit Test: Github

Source:
Example
async function test() {

    let ps
    let p
    let r

    ps = [{ x: 243, y: 206, z: 95 }, { x: 233, y: 225, z: 146 }, { x: 21, y: 325, z: 22 }, { x: 953, y: 28, z: 223 }, { x: 1092, y: 290, z: 39 }, { x: 744, y: 200, z: 191 }, { x: 174, y: 3, z: 22 }, { x: 537, y: 368, z: 249 }, { x: 1151, y: 371, z: 86 }, { x: 814, y: 252, z: 125 }]
    p = {
        x: 243,
        y: 207,
    }
    r = await interp2(ps, p)
    console.log(r)
    // => { x: 243, y: 207, z: 97.29447682486813 }

    ps = [{ x: 243, y: 206, z: 95 }, { x: 233, y: 225, z: 146 }, { x: 21, y: 325, z: 22 }, { x: 953, y: 28, z: 223 }, { x: 1092, y: 290, z: 39 }, { x: 744, y: 200, z: 191 }, { x: 174, y: 3, z: 22 }, { x: 537, y: 368, z: 249 }, { x: 1151, y: 371, z: 86 }, { x: 814, y: 252, z: 125 }]
    p = {
        x: 283,
        y: 207,
    }
    r = await interp2(ps, p)
    console.log(r)
    // => { x: 283, y: 207, z: 114.43040421951906 }

    ps = [{ x: 243, y: 206, z: 95 }, { x: 233, y: 225, z: 146 }, { x: 21, y: 325, z: 22 }, { x: 953, y: 28, z: 223 }, { x: 1092, y: 290, z: 39 }, { x: 744, y: 200, z: 191 }, { x: 174, y: 3, z: 22 }, { x: 537, y: 368, z: 249 }, { x: 1151, y: 371, z: 86 }, { x: 814, y: 252, z: 125 }]
    p = {
        x: 1160,
        y: 380,
    }
    r = await interp2(ps, p)
    console.log(r)
    // => { x: 1160, y: 380, z: null }

    ps = [{ a: 243, b: 206, c: 95 }, { a: 233, b: 225, c: 146 }, { a: 21, b: 325, c: 22 }, { a: 953, b: 28, c: 223 }, { a: 1092, b: 290, c: 39 }, { a: 744, b: 200, c: 191 }, { a: 174, b: 3, c: 22 }, { a: 537, b: 368, c: 249 }, { a: 1151, b: 371, c: 86 }, { a: 814, b: 252, c: 125 }]
    p = {
        a: 243,
        b: 207,
    }
    r = await interp2(ps, p, { keyX: 'a', keyY: 'b', keyZ: 'c' })
    console.log(r)
    // => { a: 243, b: 207, c: 97.29447682486813 }

    ps = [{ x: 243, y: 206, z: 95 }, { x: 233, y: 225, z: 146 }, { x: 21, y: 325, z: 22 }, { x: 953, y: 28, z: 223 }, { x: 1092, y: 290, z: 39 }, { x: 744, y: 200, z: 191 }, { x: 174, y: 3, z: 22 }, { x: 537, y: 368, z: 249 }, { x: 1151, y: 371, z: 86 }, { x: 814, y: 252, z: 125 }]
    p = [
        {
            x: 243,
            y: 207,
        },
        {
            x: 283,
            y: 207,
        },
    ]
    r = await interp2(ps, p)
    console.log(r)
    // => [
    //   { x: 243, y: 207, z: 97.29447682486813 },
    //   { x: 283, y: 207, z: 114.43040421951906 }
    // ]

    ps = [{ x: 243, y: 206, z: 95 }, { x: 233, y: 225, z: 146 }, { x: 21, y: 325, z: 22 }, { x: 953, y: 28, z: 223 }, { x: 1092, y: 290, z: 39 }, { x: 744, y: 200, z: 191 }, { x: 174, y: 3, z: 22 }, { x: 537, y: 368, z: 249 }, { x: 1151, y: 371, z: 86 }, { x: 814, y: 252, z: 125 }]
    p = {
        x: 243,
        y: 207,
    }
    r = await interp2(ps, p, { method: 'kriging' })
    console.log(r)
    // => { x: 243, y: 207, z: 97.4283695751981 }

    ps = [{ x: 0.000243, y: 0.000206, z: 95 }, { x: 0.000233, y: 0.000225, z: 146 }, { x: 0.000021, y: 0.000325, z: 22 }, { x: 0.000953, y: 0.000028, z: 223 }, { x: 0.001092, y: 0.00029, z: 39 }, { x: 0.000744, y: 0.000200, z: 191 }, { x: 0.000174, y: 0.000003, z: 22 }, { x: 0.000537, y: 0.000368, z: 249 }, { x: 0.001151, y: 0.000371, z: 86 }, { x: 0.000814, y: 0.000252, z: 125 }]
    p = {
        x: 0.000243,
        y: 0.000207,
    }
    r = await interp2(ps, p)
    console.log(r)
    // => { x: 0.000243, y: 0.000207, z: 97.2944768248678 }

    ps = [{ x: 243, y: 206, z: 95 }, { x: 233, y: 225, z: 146 }, { x: 21, y: 325, z: 22 }, { x: 953, y: 28, z: 223 }, { x: 1092, y: 290, z: 39 }, { x: 744, y: 200, z: 191 }, { x: 174, y: 3, z: 22 }, { x: 537, y: 368, z: 249 }, { x: 1151, y: 371, z: 86 }, { x: 814, y: 252, z: 125 }]
    p = {
        x: 243,
        y: 207,
    }
    r = await interp2(ps, p, { scale: 1000 })
    console.log(r)
    // => { x: 243, y: 207, z: 97.29447682486855 }

    ps = [{ x: 243, y: 206, z: 95 }, { x: 233, y: 225, z: 146 }, { x: 21, y: 325, z: 22 }, { x: 953, y: 28, z: 223 }, { x: 1092, y: 290, z: 39 }, { x: 744, y: 200, z: 191 }, { x: 174, y: 3, z: 22 }, { x: 537, y: 368, z: 249 }, { x: 1151, y: 371, z: 86 }, { x: 814, y: 252, z: 125 }]
    p = {
        x: 243,
        y: 207,
    }
    r = interp2(ps, p, { useSync: true }) //使用interp2.wk.umd.js則不支援sync模式
    console.log(r)
    // => { x: 243, y: 207, z: 97.29447682486813 }

}
test()
    .catch((err) => {
        console.log(err)
    })
Parameters:
Name Type Attributes Default Description
psSrc Array

輸入點陣列,為[{x:x1,y:y1},{x:x2,y:y2},...]點物件之陣列

psTar Array | Object

輸入點陣列或點物件,為[{x:x1,y:y1},{x:x2,y:y2},...]點物件之陣列,或{x:x1,y:y1}點物件

opt Object <optional>
{}

輸入設定物件,預設{}

Properties
Name Type Attributes Default Description
keyX String <optional>
'x'

輸入點物件之x座標欄位字串,預設'x'

keyY String <optional>
'y'

輸入點物件之y座標欄位字串,預設'y'

keyZ String <optional>
'z'

輸入點物件之z座標或值欄位字串,預設'z'

scale Number <optional>
1

輸入正規化範圍數值,因polybooljs處理多邊形時有數值容許誤差,故須通過縮放值域來減少問題,預設1是正規化0至1之間,使用scaleXY則是正規化為0至scaleXY之間,預設1

method String <optional>
'naturalNeighbor'

輸入內插方法字串,可選'naturalNeighbor'、'kriging',預設'naturalNeighbor'

model String <optional>
'exponential'

輸入若method='kriging'時之擬合模式字串,可選'exponential'、'gaussian'、'spherical',預設'exponential'

sigma2 Number <optional>
0

輸入若method='kriging'時之自動擬合參數sigma2數值,預設0

alpha Number <optional>
100

輸入若method='kriging'時之自動擬合參數alpha數值,預設100

returnWithVariogram Boolean <optional>
false

輸入若method='kriging'時之是否回傳擬合半變異數結果布林值,預設false

useSync Boolean <optional>
false

輸入是否使用同步函數布林值,預設false

Returns:

回傳Promise或點物件陣列或點物件,若useSync=false則回傳Promise,resolve為回傳點物件陣列或點物件,reject為失敗訊息,若useSync=true則回傳點物件陣列或點物件,若發生錯誤則回傳錯誤訊息物件

Type
Promise | Array | Object

(static) interp2Kriging(psSrc, psTar, optopt) → {Array|Object}

Description:
  • 克利金法(Kriging)內外插點數值

    克利金法計算與實際運算瓶頸問題可詳見: https://github.com/lvisei/web-developer-resources/blob/master/webassembly/kriging.md

    若是Node.js端使用須更高計算速度,可使用w-kriging: https://github.com/yuda-lyu/w-kriging

    Unit Test: Github

Source:
Example
let ps
let p
let r

ps = [{ x: 243, y: 206, z: 95 }, { x: 233, y: 225, z: 146 }, { x: 21, y: 325, z: 22 }, { x: 953, y: 28, z: 223 }, { x: 1092, y: 290, z: 39 }, { x: 744, y: 200, z: 191 }, { x: 174, y: 3, z: 22 }, { x: 537, y: 368, z: 249 }, { x: 1151, y: 371, z: 86 }, { x: 814, y: 252, z: 125 }]
p = {
    x: 243,
    y: 205,
}
r = interp2Kriging(ps, p)
console.log(r)
// => { x: 243, y: 205, z: 94.88479948418721 }

ps = [{ x: 243, y: 206, z: 95 }, { x: 233, y: 225, z: 146 }, { x: 21, y: 325, z: 22 }, { x: 953, y: 28, z: 223 }, { x: 1092, y: 290, z: 39 }, { x: 744, y: 200, z: 191 }, { x: 174, y: 3, z: 22 }, { x: 537, y: 368, z: 249 }, { x: 1151, y: 371, z: 86 }, { x: 814, y: 252, z: 125 }]
p = {
    x: 283,
    y: 205,
}
r = interp2Kriging(ps, p)
console.log(r)
// => { x: 283, y: 205, z: 116.32333499687805 }

ps = [{ x: 243, y: 206, z: 95 }, { x: 233, y: 225, z: 146 }, { x: 21, y: 325, z: 22 }, { x: 953, y: 28, z: 223 }, { x: 1092, y: 290, z: 39 }, { x: 744, y: 200, z: 191 }, { x: 174, y: 3, z: 22 }, { x: 537, y: 368, z: 249 }, { x: 1151, y: 371, z: 86 }, { x: 814, y: 252, z: 125 }]
p = {
    x: 1160,
    y: 380,
}
r = interp2Kriging(ps, p)
console.log(r)
// => { x: 1160, y: 380, z: 87.27045807621836 }

ps = [{ a: 243, b: 206, c: 95 }, { a: 233, b: 225, c: 146 }, { a: 21, b: 325, c: 22 }, { a: 953, b: 28, c: 223 }, { a: 1092, b: 290, c: 39 }, { a: 744, b: 200, c: 191 }, { a: 174, b: 3, c: 22 }, { a: 537, b: 368, c: 249 }, { a: 1151, b: 371, c: 86 }, { a: 814, b: 252, c: 125 }]
p = {
    a: 243,
    b: 205,
}
r = interp2Kriging(ps, p, { keyX: 'a', keyY: 'b', keyZ: 'c' })
console.log(r)
// => { a: 243, b: 205, c: 94.88479948418721 }

ps = [{ x: 243, y: 206, z: 95 }, { x: 233, y: 225, z: 146 }, { x: 21, y: 325, z: 22 }, { x: 953, y: 28, z: 223 }, { x: 1092, y: 290, z: 39 }, { x: 744, y: 200, z: 191 }, { x: 174, y: 3, z: 22 }, { x: 537, y: 368, z: 249 }, { x: 1151, y: 371, z: 86 }, { x: 814, y: 252, z: 125 }]
p = [
    {
        x: 243,
        y: 205,
    },
    {
        x: 283,
        y: 205,
    },
]
r = interp2Kriging(ps, p)
console.log(r)
// => [
//   { x: 243, y: 205, z: 94.88479948418721 },
//   { x: 283, y: 205, z: 116.32333499687805 }
// ]

ps = [{ x: 243, y: 206, z: 95 }, { x: 233, y: 225, z: 146 }, { x: 21, y: 325, z: 22 }, { x: 953, y: 28, z: 223 }, { x: 1092, y: 290, z: 39 }, { x: 744, y: 200, z: 191 }, { x: 174, y: 3, z: 22 }, { x: 537, y: 368, z: 249 }, { x: 1151, y: 371, z: 86 }, { x: 814, y: 252, z: 125 }]
p = {
    x: 243,
    y: 205,
}
r = interp2Kriging(ps, p, { scale: 1000 })
console.log(r)
// => { x: 243, y: 205, z: 94.88479948418878 }

ps = [{ x: 243, y: 206, z: 95 }, { x: 233, y: 225, z: 146 }, { x: 21, y: 325, z: 22 }, { x: 953, y: 28, z: 223 }, { x: 1092, y: 290, z: 39 }, { x: 744, y: 200, z: 191 }, { x: 174, y: 3, z: 22 }, { x: 537, y: 368, z: 249 }, { x: 1151, y: 371, z: 86 }, { x: 814, y: 252, z: 125 }]
p = {
    x: 243,
    y: 205,
}
r = interp2Kriging(ps, p, { model: 'gaussian' })
console.log(r)
// => { x: 243, y: 205, z: 92.39124139470005 }

ps = [{ x: 243, y: 206, z: 95 }, { x: 233, y: 225, z: 146 }, { x: 21, y: 325, z: 22 }, { x: 953, y: 28, z: 223 }, { x: 1092, y: 290, z: 39 }, { x: 744, y: 200, z: 191 }, { x: 174, y: 3, z: 22 }, { x: 537, y: 368, z: 249 }, { x: 1151, y: 371, z: 86 }, { x: 814, y: 252, z: 125 }]
p = {
    x: 243,
    y: 205,
}
r = interp2Kriging(ps, p, { sigma2: 0.001, alpha: 70 })
console.log(r)
// => { x: 243, y: 205, z: 90.88702949276343 }

ps = [{ x: 243, y: 206, z: 95 }, { x: 233, y: 225, z: 146 }, { x: 21, y: 325, z: 22 }, { x: 953, y: 28, z: 223 }, { x: 1092, y: 290, z: 39 }, { x: 744, y: 200, z: 191 }, { x: 174, y: 3, z: 22 }, { x: 537, y: 368, z: 249 }, { x: 1151, y: 371, z: 86 }, { x: 814, y: 252, z: 125 }]
p = {
    x: 243,
    y: 205,
}
r = interp2Kriging(ps, p, { returnWithVariogram: true })
console.log(r)
// => {
//   result: { x: 243, y: 205, z: 94.88479948418721 },
//   variogram: {
//     t: [
//       0.32158590308370044,
//       0.5462555066079295,
//       0,
//       0.8854625550660793,
//       0.07488986784140969,
//       0.7444933920704846,
//       0,
//       1,
//       0.28193832599118945,
//       0.45374449339207046
//     ],
//     x: [
//       0.19646017699115045,
//       0.18761061946902655,
//       0,
//       0.8247787610619469,
//       0.947787610619469,
//       0.6398230088495576,
//       0.13539823008849558,
//       0.45663716814159294,
//       1,
//       0.7017699115044248
//     ],
//     y: [
//       0.5168141592920354,
//       0.5336283185840708,
//       0.6221238938053097,
//       0.35929203539823007,
//       0.5911504424778761,
//       0.511504424778761,
//       0.33716814159292036,
//       0.6601769911504425,
//       0.6628318584070797,
//       0.5575221238938053
//     ],
//     nugget: 0.33528534923428144,
//     range: 0.9818274204120488,
//     sill: 0.4584580333443075,
//     A: 0.3333333333333333,
//     n: 10,
//     model: [Function: kriging_variogram_exponential],
//     svpd: { data: [Array], bars: [Array] },
//     K: [
//          -75.8517004175245,       67.925722923484, -0.16335841036964677,
//        0.24131518978270877,  -0.04234246865048732,   0.8770518396328912,
//          5.616960362170279,     1.621659637440227, 0.027888001651894635,
//       -0.21415853416652803,     67.92572292348402,   -75.61786478824868,
//          5.413232079727064,   0.04906943438385958,  0.03679113229348465,
//       -0.11847139352698677,    0.3142012767297917,   1.9531078854430024,
//        0.14216377854055343, -0.026503104672525174,   -0.163358410369651,
//          5.413232079727067,   -10.341088741602475,    0.707690256415205,
//         0.2717259477481375,    -0.032751338327818,   2.4021510467734406,
//         1.1039529303204958,    0.9343241199626711,  0.17593910677199553,
//        0.24131518978268823,   0.04906943438388453,   0.7076902564152006,
//        -11.195895809332818,    3.6318326767168267,   3.0935386508887035,
//         1.0451553499568136,   0.07681115159025198,   0.5500520981253416,
//          2.176928207710048,  -0.04234246865049055,  0.03679113229348578,
//        0.27172594774813813,    3.6318326767168188,  -21.833991833397526,
//        -0.3703544567031784,    0.1631940797086814,   0.1478485285302121,
//         14.592661153646349,     3.529640759660949,    0.877051839632884,
//       -0.11847139352697111, -0.032751338327819686,   3.0935386508886986,
//       -0.37035445670318073,   -23.428385057803695,   0.8346909075984952,
//          3.683800415485778,  -0.07094528659968152,   15.630834782735722,
//          5.616960362170238,   0.31420127672983256,   2.4021510467734397,
//          1.045155349956815,   0.16319407970868527,   0.8346909075984923,
//         -11.15967643574728,   0.47980505727623907,   0.7525119639869473,
//        -0.0399020216261384,    1.6216596374402739,   1.9531078854429533,
//         1.1039529303204962,   0.07681115159024962,   0.1478485285302013,
//         3.6838004154857935,      0.47980505727624,  -11.594555930753835,
//         0.9237284214140226,    1.8947859772223308, 0.027888001651917377,
//        0.14216377854053472,    0.9343241199626732,   0.5500520981253476,
//         14.592661153646347,   -0.0709452865996735,   0.7525119639869486,
//         0.9237284214140111,   -18.251230245653318,    0.837959693391809,
//       -0.21415853416654693, -0.026503104672517874,   0.1759391067719989,
//          2.176928207710053,     3.529640759660952,   15.630834782735704,
//       -0.03990202162613744,     1.894785977222343,   0.8379596933918148,
//         -23.89204017145281
//     ],
//     M: [
//       15.107775528173802,
//       -17.52355316402437,
//       4.974279767668829,
//       -6.014370838628359,
//       7.175095294789402,
//       -3.7572657339807183,
//       4.210920521157788,
//       -6.064323143863013,
//       -2.2280724452952487,
//       5.035785385549117
//     ]
//   }
// }
Parameters:
Name Type Attributes Default Description
psSrc Array

輸入二維座標加觀測數據點陣列,為[{x:x1,y:y1,z:z1},{x:x2,y:y2,z:z2},...]點物件之陣列

psTar Array | Object

輸入二維座標點陣列或點物件,為[{x:x1,y:y1},{x:x2,y:y2},...]點物件之陣列,或{x:x1,y:y1}點物件

opt Object <optional>
{}

輸入設定物件,預設{}

Properties
Name Type Attributes Default Description
keyX String <optional>
'x'

輸入點物件之x欄位字串,為座標,預設'x'

keyY String <optional>
'y'

輸入點物件之y欄位字串,為座標,預設'y'

keyZ String <optional>
'z'

輸入點物件之z欄位字串,為觀測值,預設'z'

scale Number <optional>
1

輸入正規化範圍數值,因polybooljs處理多邊形時有數值容許誤差,故須通過縮放值域來減少問題,預設1是正規化0至1之間,使用scaleXY則是正規化為0至scaleXY之間,預設1

model String <optional>
'exponential'

輸入擬合模式字串,可選'exponential'、'gaussian'、'spherical',預設'exponential'

sigma2 Number <optional>
0

輸入自動擬合參數sigma2數值,預設0

alpha Number <optional>
100

輸入自動擬合參數alpha數值,預設100

returnWithVariogram Boolean <optional>
false

輸入是否回傳擬合半變異數結果布林值,預設false

Returns:

回傳點物件陣列或點物件,若使用returnWithVariogram=true則回傳物件資訊,若發生錯誤則回傳錯誤訊息物件

Type
Array | Object

(static) interp2NaturalNeighbor(psSrc, psTar, optopt) → {Array|Object}

Description:
  • 自然鄰點內插法(Natural Neighbor Interpolation)內插點數值

    A Fast and Accurate Algorithm for Natural Neighbor Interpolation https://gwlucastrig.github.io/TinfourDocs/NaturalNeighborTinfourAlgorithm/index.html

    An Introduction to Natural Neighbor Interpolation https://gwlucastrig.github.io/TinfourDocs/NaturalNeighborIntro/index.html

    [wiki]Natural neighbor interpolation https://en.wikipedia.org/wiki/Natural_neighbor_interpolation

    Natural neighbor interpolation https://observablehq.com/@karlerss/natural-neighbor-interpolation

    d3-delaunay https://github.com/d3/d3-delaunay

    Unit Test: Github

Source:
Example
let ps
let p
let r

ps = [{ x: 243, y: 206, z: 95 }, { x: 233, y: 225, z: 146 }, { x: 21, y: 325, z: 22 }, { x: 953, y: 28, z: 223 }, { x: 1092, y: 290, z: 39 }, { x: 744, y: 200, z: 191 }, { x: 174, y: 3, z: 22 }, { x: 537, y: 368, z: 249 }, { x: 1151, y: 371, z: 86 }, { x: 814, y: 252, z: 125 }]
p = {
    x: 243,
    y: 207,
}
r = interp2NaturalNeighbor(ps, p)
console.log(r)
// => { x: 243, y: 207, z: 97.29447682486813 }

ps = [{ x: 243, y: 206, z: 95 }, { x: 233, y: 225, z: 146 }, { x: 21, y: 325, z: 22 }, { x: 953, y: 28, z: 223 }, { x: 1092, y: 290, z: 39 }, { x: 744, y: 200, z: 191 }, { x: 174, y: 3, z: 22 }, { x: 537, y: 368, z: 249 }, { x: 1151, y: 371, z: 86 }, { x: 814, y: 252, z: 125 }]
p = {
    x: 1243,
    y: 1207,
}
r = interp2NaturalNeighbor(ps, p)
console.log(r)
// => { x: 1243, y: 1207, z: null }

ps = [{ x: 243, y: 206, z: 95 }, { x: null, y: 201, z: 122 }, { x: 233, y: 225, z: 146 }, { x: 21, y: 325, z: 22 }, { x: 953, y: 28, z: 223 }, { x: 1092, y: 290, z: 39 }, { x: 744, y: 200, z: 191 }, { x: 174, y: 3, z: 22 }, { x: 537, y: 368, z: 249 }, { x: 1151, y: 371, z: 86 }, { x: 814, y: 252, z: 125 }]
p = {
    x: 243,
    y: 207,
}
let funInterpFragment = (msg) => {
    // console.log('funInterpFragment', msg)
    return msg.v //預設回傳msg.v, 三角形三角點各點v為rA*z, 故三點之rA合為1, 指定內插值z為三角點v之總和(v1,v2,v3)
}
r = interp2NaturalNeighbor(ps, p, { funInterpFragment })
console.log(r)
// => { x: 243, y: 207, z: 97.29447682486813 }

ps = [{ x: 243, y: 206, z: 95 }, { x: null, y: 201, z: 122 }, { x: 233, y: 225, z: 146 }, { x: 21, y: 325, z: 22 }, { x: 953, y: 28, z: 223 }, { x: 1092, y: 290, z: 39 }, { x: 744, y: 200, z: 191 }, { x: 174, y: 3, z: 22 }, { x: 537, y: 368, z: 249 }, { x: 1151, y: 371, z: 86 }, { x: 814, y: 252, z: 125 }]
p = {
    x: 1243,
    y: 1207,
}
let funInterpFragmentNoUse = (msg) => {
    // console.log('funInterpFragmentNoUse', msg)
    return msg.v //預設回傳msg.v, 此處因內插點於原始點所形成最小凸多邊形之外, 故無法內插, 亦不會呼叫funInterpFragment
}
r = interp2NaturalNeighbor(ps, p, { funInterpFragment: funInterpFragmentNoUse })
console.log(r)
// => { x: 1243, y: 1207, z: null }

ps = [{ x: 243, y: 206, z: 95 }, { x: null, y: 201, z: 122 }, { x: 233, y: 225, z: 146 }, { x: 21, y: 325, z: 22 }, { x: 953, y: 28, z: 223 }, { x: 1092, y: 290, z: 39 }, { x: 744, y: 200, z: 191 }, { x: 174, y: 3, z: 22 }, { x: 537, y: 368, z: 249 }, { x: 1151, y: 371, z: 86 }, { x: 814, y: 252, z: 125 }]
p = {
    x: 243,
    y: 207,
}
let funInterpFragments = (msg) => {
    // console.log('funInterpFragments', msg)
    // let v = ps[0].v + ps[1].v + ps[2].v
    return msg.v //預設回傳msg.v, 三角形三角點為msg.ps, 各點v為rA*z, 故三點之rA合為1, 指定內插值z為三角點v之總和(v1,v2,v3)
}
r = interp2NaturalNeighbor(ps, p, { funInterpFragments })
console.log(r)
// => { x: 243, y: 207, z: 97.29447682486813 }

ps = [{ x: 243, y: 206, z: 95 }, { x: 233, y: 225, z: 146 }, { x: 21, y: 325, z: 22 }, { x: 953, y: 28, z: 223 }, { x: 1092, y: 290, z: 39 }, { x: 744, y: 200, z: 191 }, { x: 174, y: 3, z: 22 }, { x: 537, y: 368, z: 249 }, { x: 1151, y: 371, z: 86 }, { x: 814, y: 252, z: 125 }]
p = {
    x: 283,
    y: 207,
}
r = interp2NaturalNeighbor(ps, p)
console.log(r)
// => { x: 283, y: 207, z: 114.43040421951906 }

ps = [{ x: 243, y: 206, z: 95 }, { x: 233, y: 225, z: 146 }, { x: 21, y: 325, z: 22 }, { x: 953, y: 28, z: 223 }, { x: 1092, y: 290, z: 39 }, { x: 744, y: 200, z: 191 }, { x: 174, y: 3, z: 22 }, { x: 537, y: 368, z: 249 }, { x: 1151, y: 371, z: 86 }, { x: 814, y: 252, z: 125 }]
p = {
    x: 1160,
    y: 380,
}
r = interp2NaturalNeighbor(ps, p)
console.log(r)
// => { x: 1160, y: 380, z: null }

ps = [{ a: 243, b: 206, c: 95 }, { a: 233, b: 225, c: 146 }, { a: 21, b: 325, c: 22 }, { a: 953, b: 28, c: 223 }, { a: 1092, b: 290, c: 39 }, { a: 744, b: 200, c: 191 }, { a: 174, b: 3, c: 22 }, { a: 537, b: 368, c: 249 }, { a: 1151, b: 371, c: 86 }, { a: 814, b: 252, c: 125 }]
p = {
    a: 243,
    b: 207,
}
r = interp2NaturalNeighbor(ps, p, { keyX: 'a', keyY: 'b', keyZ: 'c' })
console.log(r)
// => { a: 243, b: 207, c: 97.29447682486813 }

ps = [{ x: 243, y: 206, z: 95 }, { x: 233, y: 225, z: 146 }, { x: 21, y: 325, z: 22 }, { x: 953, y: 28, z: 223 }, { x: 1092, y: 290, z: 39 }, { x: 744, y: 200, z: 191 }, { x: 174, y: 3, z: 22 }, { x: 537, y: 368, z: 249 }, { x: 1151, y: 371, z: 86 }, { x: 814, y: 252, z: 125 }]
p = [
    {
        x: 243,
        y: 207,
    },
    {
        x: 283,
        y: 207,
    },
]
r = interp2NaturalNeighbor(ps, p)
console.log(r)
// => [
//   { x: 243, y: 207, z: 97.29447682486813 },
//   { x: 283, y: 207, z: 114.43040421951906 }
// ]

ps = [{ x: 0.000243, y: 0.000206, z: 95 }, { x: 0.000233, y: 0.000225, z: 146 }, { x: 0.000021, y: 0.000325, z: 22 }, { x: 0.000953, y: 0.000028, z: 223 }, { x: 0.001092, y: 0.00029, z: 39 }, { x: 0.000744, y: 0.000200, z: 191 }, { x: 0.000174, y: 0.000003, z: 22 }, { x: 0.000537, y: 0.000368, z: 249 }, { x: 0.001151, y: 0.000371, z: 86 }, { x: 0.000814, y: 0.000252, z: 125 }]
p = {
    x: 0.000243,
    y: 0.000207,
}
r = interp2NaturalNeighbor(ps, p)
console.log(r)
// => { x: 0.000243, y: 0.000207, z: 97.2944768248678 }

ps = [{ x: 243, y: 206, z: 95 }, { x: 233, y: 225, z: 146 }, { x: 21, y: 325, z: 22 }, { x: 953, y: 28, z: 223 }, { x: 1092, y: 290, z: 39 }, { x: 744, y: 200, z: 191 }, { x: 174, y: 3, z: 22 }, { x: 537, y: 368, z: 249 }, { x: 1151, y: 371, z: 86 }, { x: 814, y: 252, z: 125 }]
p = {
    x: 243,
    y: 207,
}
r = interp2NaturalNeighbor(ps, p, { scale: 1000 })
console.log(r)
// => { x: 243, y: 207, z: 97.29447682486855 }
Parameters:
Name Type Attributes Default Description
psSrc Array

輸入二維座標加觀測數據點陣列,為[{x:x1,y:y1,z:z1},{x:x2,y:y2,z:z2},...]點物件之陣列

psTar Array | Object

輸入二維座標點陣列或點物件,為[{x:x1,y:y1},{x:x2,y:y2},...]點物件之陣列,或{x:x1,y:y1}點物件

opt Object <optional>
{}

輸入設定物件,預設{}

Properties
Name Type Attributes Default Description
keyX String <optional>
'x'

輸入點物件之x欄位字串,為座標,預設'x'

keyY String <optional>
'y'

輸入點物件之y欄位字串,為座標,預設'y'

keyZ String <optional>
'z'

輸入點物件之z欄位字串,為觀測值,預設'z'

scale Number <optional>
1

輸入正規化範圍數值,因polybooljs處理多邊形時有數值容許誤差,故須通過縮放值域來減少問題,預設1是正規化0至1之間,使用scaleXY則是正規化為0至scaleXY之間,預設1

Returns:

回傳點物件陣列或點物件,若發生錯誤則回傳錯誤訊息物件

Type
Array | Object

(async, static) interp3(psSrc, psTar) → {Promise|Array|Object}

Description:
  • 針對不規則三維數據進行指定內插點數值

    Unit Test: Github

Source:
Example
async function test() {

    let ps
    let p
    let r

    ps = [{ x: 243, y: 206, z: 95, v: 2.2 }, { x: 233, y: 225, z: 146, v: 15.1 }, { x: 21, y: 325, z: 22, v: 7.9 }, { x: 953, y: 28, z: 223, v: 5.1 }, { x: 1092, y: 290, z: 39, v: 17.5 }, { x: 744, y: 200, z: 191, v: 6.6 }, { x: 174, y: 3, z: 22, v: 1.4 }, { x: 537, y: 368, z: 249, v: 2.9 }, { x: 1151, y: 371, z: 86, v: 7.3 }, { x: 814, y: 252, z: 125, v: 8.2 }]
    p = {
        x: 243,
        y: 207,
        z: 100,
    }
    r = await interp3(ps, p)
    console.log(r)
    // => { x: 243, y: 207, z: 100, v: 3.4894028270041137 }

    ps = [{ x: 243, y: 206, z: 95, v: 2.2 }, { x: 233, y: 225, z: 146, v: 15.1 }, { x: 21, y: 325, z: 22, v: 7.9 }, { x: 953, y: 28, z: 223, v: 5.1 }, { x: 1092, y: 290, z: 39, v: 17.5 }, { x: 744, y: 200, z: 191, v: 6.6 }, { x: 174, y: 3, z: 22, v: 1.4 }, { x: 537, y: 368, z: 249, v: 2.9 }, { x: 1151, y: 371, z: 86, v: 7.3 }, { x: 814, y: 252, z: 125, v: 8.2 }]
    p = {
        x: 283,
        y: 207,
        z: 100,
    }
    r = await interp3(ps, p)
    console.log(r)
    // => { x: 283, y: 207, z: 100, v: 2.5832273787671967 }

    ps = [{ x: 243, y: 206, z: 95, v: 2.2 }, { x: 233, y: 225, z: 146, v: 15.1 }, { x: 21, y: 325, z: 22, v: 7.9 }, { x: 953, y: 28, z: 223, v: 5.1 }, { x: 1092, y: 290, z: 39, v: 17.5 }, { x: 744, y: 200, z: 191, v: 6.6 }, { x: 174, y: 3, z: 22, v: 1.4 }, { x: 537, y: 368, z: 249, v: 2.9 }, { x: 1151, y: 371, z: 86, v: 7.3 }, { x: 814, y: 252, z: 125, v: 8.2 }]
    p = {
        x: 1160,
        y: 380,
        z: 100,
    }
    r = await interp3(ps, p)
    console.log(r)
    // => { x: 1160, y: 380, z: null }

    ps = [{ a: 243, b: 206, c: 95, d: 2.2 }, { a: 233, b: 225, c: 146, d: 15.1 }, { a: 21, b: 325, c: 22, d: 7.9 }, { a: 953, b: 28, c: 223, d: 5.1 }, { a: 1092, b: 290, c: 39, d: 17.5 }, { a: 744, b: 200, c: 191, d: 6.6 }, { a: 174, b: 3, c: 22, d: 1.4 }, { a: 537, b: 368, c: 249, d: 2.9 }, { a: 1151, b: 371, c: 86, d: 7.3 }, { a: 814, b: 252, c: 125, d: 8.2 }]
    p = {
        a: 243,
        b: 207,
        c: 100,
    }
    r = await interp3(ps, p, { keyX: 'a', keyY: 'b', keyZ: 'c', keyV: 'd' })
    console.log(r)
    // => { a: 243, b: 207, c: 100, d: 3.4894028270041137 }

    ps = [{ x: 243, y: 206, z: 95, v: 2.2 }, { x: 233, y: 225, z: 146, v: 15.1 }, { x: 21, y: 325, z: 22, v: 7.9 }, { x: 953, y: 28, z: 223, v: 5.1 }, { x: 1092, y: 290, z: 39, v: 17.5 }, { x: 744, y: 200, z: 191, v: 6.6 }, { x: 174, y: 3, z: 22, v: 1.4 }, { x: 537, y: 368, z: 249, v: 2.9 }, { x: 1151, y: 371, z: 86, v: 7.3 }, { x: 814, y: 252, z: 125, v: 8.2 }]
    p = [
        {
            x: 243,
            y: 207,
            z: 100,
        },
        {
            x: 283,
            y: 207,
            z: 100,
        },
    ]
    r = await interp3(ps, p)
    console.log(r)
    // => [
    //   { x: 243, y: 207, z: 100, v: 3.4894028270041137 },
    //   { x: 283, y: 207, z: 100, v: 2.5832273787671967 }
    // ]

    ps = [{ x: 0.000243, y: 0.000206, z: 0.000095, v: 2.2 }, { x: 0.000233, y: 0.000225, z: 0.000146, v: 15.1 }, { x: 0.000021, y: 0.000325, z: 0.000022, v: 7.9 }, { x: 0.000953, y: 0.000028, z: 0.000223, v: 5.1 }, { x: 0.001092, y: 0.00029, z: 0.000039, v: 17.5 }, { x: 0.000744, y: 0.0002, z: 0.000191, v: 6.6 }, { x: 0.000174, y: 0.000003, z: 0.000022, v: 1.4 }, { x: 0.000537, y: 0.000368, z: 0.000249, v: 2.9 }, { x: 0.001151, y: 0.000371, z: 0.000086, v: 7.3 }, { x: 0.000814, y: 0.000252, z: 0.000125, v: 8.2 }]
    p = {
        x: 0.000243,
        y: 0.000207,
        z: 0.0001,
    }
    r = await interp3(ps, p)
    console.log(r)
    // => { x: 0.000243, y: 0.000207, z: 100, v: 3.489402827004115 }

}
test()
    .catch((err) => {
        console.log(err)
    })
Parameters:
Name Type Attributes Default Description
psSrc Array

輸入點陣列,為[{x:x1,y:y1},{x:x2,y:y2},...]點物件之陣列

psTar Array | Object

輸入點陣列或點物件,為[{x:x1,y:y1},{x:x2,y:y2},...]點物件之陣列,或{x:x1,y:y1}點物件

opt.keyX String <optional>
'x'

輸入點物件之x座標欄位字串,預設'x'

opt.keyY String <optional>
'y'

輸入點物件之y座標欄位字串,預設'y'

opt.keyZ String <optional>
'z'

輸入點物件之z座標或值欄位字串,預設'z'

Returns:

回傳Promise或點物件陣列或點物件,若useSync=false則回傳Promise,resolve為回傳點物件陣列或點物件,reject為失敗訊息,若useSync=true則回傳點物件陣列或點物件,若發生錯誤則回傳錯誤訊息物件

Type
Promise | Array | Object

(static) isPointInPolygons(p, pgs, optopt) → {Boolean}

Description:
  • 判斷點陣列[x,y]或點物件{x,y}是否位於多邊形陣列內

    Unit Test: Github

Source:
Example
let p
let pgs
let b

p = [0.5, 0.5]
pgs = [
    [0, 0],
    [0, 1],
    [1, 1],
    [1, 0],
    [0, 0],
]
b = isPointInPolygons(p, pgs)
console.log(b)
// => true

p = [1.5, 0.5]
pgs = [
    [0, 0],
    [0, 1],
    [1, 1],
    [1, 0],
    [0, 0],
]
b = isPointInPolygons(p, pgs)
console.log(b)
// => false
Parameters:
Name Type Attributes Default Description
p Array | Object

輸入點陣列或點物件,為[x,y]或{x,y}

pgs Array

輸入多邊形陣列

opt Object <optional>
{}

輸入設定物件,預設{}

Properties
Name Type Attributes Default Description
keyX String <optional>
'x'

輸入點物件x座標鍵字串,預設'x'

keyY String <optional>
'y'

輸入點物件y座標鍵字串,預設'y'

supposeType String <optional>
'polygons'

輸入提取模式字串,當數據座標深度為2時,使用polygons代表每個其內多邊形為獨立polygon,若為ringStrings則表示其內多邊形為交錯的ringString(代表聯集與剔除),預設'polygons'

toTurfMultiPolygon Boolean <optional>
true

輸入是否轉換多邊形為Turf的MultiPolygon,若須加速可於外部先轉好就不用於函數內再轉,預設true

Returns:

回傳是否位於多邊形陣列內布林值

Type
Boolean

(static) normalizeArray(arr) → {Array|Object}

Description:
  • 針對一維或二維陣列正規化

    Unit Test: Github

Source:
Example
let arr
let r

arr = [
    [243, 206, 95],
    [233, 225, 146],
    [21, 325, 22],
    [953, 28, 223],
    [1092, 290, 39],
    [744, 200, 191],
    [174, 3, 22],
    [537, 368, 249],
    [1151, 371, 86],
    [814, 252, 125]
]
r = normalizeArray(arr)
console.log(r)
// => [
//   {
//     arr: [
//       0.19646017699115045,
//       0.18761061946902655,
//       0,
//       0.8247787610619469,
//       0.947787610619469,
//       0.6398230088495576,
//       0.13539823008849558,
//       0.45663716814159294,
//       1,
//       0.7017699115044248
//     ],
//     min: 21,
//     max: 1151,
//     range: 1130,
//     avg: 596.2
//   },
//   {
//     arr: [
//       0.5516304347826086,
//       0.6032608695652174,
//       0.875,
//       0.06793478260869565,
//       0.779891304347826,
//       0.5353260869565217,
//       0,
//       0.9918478260869565,
//       1,
//       0.6766304347826086
//     ],
//     min: 3,
//     max: 371,
//     range: 368,
//     avg: 226.8
//   },
//   {
//     arr: [
//       0.32158590308370044,
//       0.5462555066079295,
//       0,
//       0.8854625550660793,
//       0.07488986784140969,
//       0.7444933920704846,
//       0,
//       1,
//       0.28193832599118945,
//       0.45374449339207046
//     ],
//     min: 22,
//     max: 249,
//     range: 227,
//     avg: 119.8
//   }
// ]

arr = [
    243, 233, 21,
    953, 1092, 744,
    174, 537, 1151,
    814
]
r = normalizeArray(arr)
console.log(r)
// => {
//   arr: [
//     0.19646017699115045,
//     0.18761061946902655,
//     0,
//     0.8247787610619469,
//     0.947787610619469,
//     0.6398230088495576,
//     0.13539823008849558,
//     0.45663716814159294,
//     1,
//     0.7017699115044248
//   ],
//   min: 21,
//   max: 1151,
//   range: 1130,
//   avg: 596.2
// }

arr = [{ x: 243, y: 206, z: 95 }, { x: 233, y: 225, z: 146 }, { x: 21, y: 325, z: 22 }, { x: 953, y: 28, z: 223 }, { x: 1092, y: 290, z: 39 }, { x: 744, y: 200, z: 191 }, { x: 174, y: 3, z: 22 }, { x: 537, y: 368, z: 249 }, { x: 1151, y: 371, z: 86 }, { x: 814, y: 252, z: 125 }]
r = normalizeArray(arr, ['x', 'y', 'z'])
console.log(r)
// => [
//   {
//     arr: [
//       0.19646017699115045,
//       0.18761061946902655,
//       0,
//       0.8247787610619469,
//       0.947787610619469,
//       0.6398230088495576,
//       0.13539823008849558,
//       0.45663716814159294,
//       1,
//       0.7017699115044248
//     ],
//     min: 21,
//     max: 1151,
//     range: 1130,
//     avg: 596.2
//   },
//   {
//     arr: [
//       0.5516304347826086,
//       0.6032608695652174,
//       0.875,
//       0.06793478260869565,
//       0.779891304347826,
//       0.5353260869565217,
//       0,
//       0.9918478260869565,
//       1,
//       0.6766304347826086
//     ],
//     min: 3,
//     max: 371,
//     range: 368,
//     avg: 226.8
//   },
//   {
//     arr: [
//       0.32158590308370044,
//       0.5462555066079295,
//       0,
//       0.8854625550660793,
//       0.07488986784140969,
//       0.7444933920704846,
//       0,
//       1,
//       0.28193832599118945,
//       0.45374449339207046
//     ],
//     min: 22,
//     max: 249,
//     range: 227,
//     avg: 119.8
//   }
// ]
Parameters:
Name Type Description
arr Array

輸入資料陣列,為[x1,x2,...]之一維陣列,或[[x1,y1],[x2,y2],...]之二維陣列

Returns:

回傳正規化數據之物件或陣列

Type
Array | Object

(static) ptXYtoObj(p, optopt) → {Object}

Description:
  • 提取點陣列[x,y]或點物件{x,y}為點物件{x,y}

    Unit Test: Github

Source:
Example
let p
let r

p = [1, 2]
r = ptXYtoObj(p)
console.log(r)
// => [ 1, 2 ]

p = { x: 1, y: 2 }
r = ptXYtoObj(p)
console.log(r)
// => [ 1, 2 ]
Parameters:
Name Type Attributes Default Description
p Array | Object

輸入點陣列或點物件,為[x,y]或{x,y}

opt Object <optional>
{}

輸入設定物件,預設{}

Properties
Name Type Attributes Default Description
keyX String <optional>
'x'

輸入點物件x座標鍵字串,預設'x'

keyY String <optional>
'y'

輸入點物件y座標鍵字串,預設'y'

Returns:

回傳點物件{x,y}

Type
Object

(static) ptsXYZVtoArr(ps, optopt) → {Array}

Description:
  • 提取點陣列內之點[0,1,2,3]或{x,y,z,v}或指定鍵值成為點{x,y,z,v}物件陣列

    Unit Test: Github

Source:
Example
let ps
let r

ps = [[243, 206, 95, 2.2], [233, 225, 146, 15.1], [21, 325, 22, 7.9]]
r = ptsXYZVtoArr(ps)
console.log(r)
// => [
//   { x: 243, y: 206, z: 95, v: 2.2, ind: 0 },
//   { x: 233, y: 225, z: 146, v: 15.1, ind: 1 },
//   { x: 21, y: 325, z: 22, v: 7.9, ind: 2 }
// ]

ps = [{ 'x': 243, 'y': 206, 'z': 95, 'v': 2.2 }, { 'x': 233, 'y': 225, 'z': 146, 'v': 15.1 }, { 'x': 21, 'y': 325, 'z': 22, 'v': 7.9 }]
r = ptsXYZVtoArr(ps)
console.log(r)
// => [
//   { x: 243, y: 206, z: 95, v: 2.2, ind: 0 },
//   { x: 233, y: 225, z: 146, v: 15.1, ind: 1 },
//   { x: 21, y: 325, z: 22, v: 7.9, ind: 2 }
// ]

ps = [{ 'a': 243, 'b': 206, 'c': 95, 'd': 2.2 }, { 'a': 233, 'b': 225, 'c': 146, 'd': 15.1 }, { 'a': 21, 'b': 325, 'c': 22, 'd': 7.9 }]
r = ptsXYZVtoArr(ps, { keyX: 'a', keyY: 'b', keyZ: 'c', keyV: 'd' })
console.log(r)
// => [
//   { x: 243, y: 206, z: 95, v: 2.2, ind: 0 },
//   { x: 233, y: 225, z: 146, v: 15.1, ind: 1 },
//   { x: 21, y: 325, z: 22, v: 7.9, ind: 2 }
// ]
Parameters:
Name Type Attributes Default Description
ps Array

輸入點陣列,為[{x:x1,y:y1,z:z1,v:v1},{x:x2,y:y2,z:z2,v:v2},...]點物件之陣列,或[[x1,y1,z1,v1],[x2,y2,z2,v2],...]點座標陣列之陣列

opt Object <optional>
{}

輸入設定物件,預設{}

Properties
Name Type Attributes Default Description
keyX String <optional>
'x'

輸入點物件x座標鍵字串,預設'x'

keyY String <optional>
'y'

輸入點物件y座標鍵字串,預設'y'

keyY String <optional>
'z'

輸入點物件z座標鍵字串,預設'z'

keyV String <optional>
'v'

輸入點物件v座標鍵字串,預設'v'

keyInd String <optional>
'ind'

輸入點物件指標鍵字串,預設'ind'

returnObjArray Boolean <optional>
true

輸入是否回傳物件陣列,若true代表回傳點為物件{x,y,z,v}之陣列,若false回傳點陣列[x,y,z,v]之陣列,預設true

Returns:

回傳點{x,y,z,v}陣列

Type
Array

(static) ptsXYZtoArr(ps, optopt) → {Array}

Description:
  • 提取點陣列內之點[0,1,2]或{x,y,z}或指定鍵值成為點{x,y,z}物件陣列

    Unit Test: Github

Source:
Example
let ps
let r

ps = [[243, 206, 95], [233, 225, 146], [21, 325, 22]]
r = ptsXYZtoArr(ps)
console.log(r)
// => [
//   { x: 243, y: 206, z: 95, ind: 0 },
//   { x: 233, y: 225, z: 146, ind: 1 },
//   { x: 21, y: 325, z: 22, ind: 2 }
// ]

ps = [{ 'x': 243, 'y': 206, 'z': 95 }, { 'x': 233, 'y': 225, 'z': 146 }, { 'x': 21, 'y': 325, 'z': 22 }]
r = ptsXYZtoArr(ps)
console.log(r)
// => [
//   { x: 243, y: 206, z: 95, ind: 0 },
//   { x: 233, y: 225, z: 146, ind: 1 },
//   { x: 21, y: 325, z: 22, ind: 2 }
// ]

ps = [{ 'a': 243, 'b': 206, 'c': 95 }, { 'a': 233, 'b': 225, 'c': 146 }, { 'a': 21, 'b': 325, 'c': 22 }]
r = ptsXYZtoArr(ps, { keyX: 'a', keyY: 'b', keyZ: 'c' })
console.log(r)
// => [
//   { x: 243, y: 206, z: 95, ind: 0 },
//   { x: 233, y: 225, z: 146, ind: 1 },
//   { x: 21, y: 325, z: 22, ind: 2 }
// ]
Parameters:
Name Type Attributes Default Description
ps Array

輸入點陣列,為[{x:x1,y:y1,z:z1},{x:x2,y:y2,z:z2},...]點物件之陣列,或[[x1,y1,z1],[x2,y2,z2],...]點座標陣列之陣列

opt Object <optional>
{}

輸入設定物件,預設{}

Properties
Name Type Attributes Default Description
keyX String <optional>
'x'

輸入點物件x座標鍵字串,預設'x'

keyY String <optional>
'y'

輸入點物件y座標鍵字串,預設'y'

keyY String <optional>
'z'

輸入點物件z座標鍵字串,預設'z'

keyInd String <optional>
'ind'

輸入點物件指標鍵字串,預設'ind'

returnObjArray Boolean <optional>
true

輸入是否回傳物件陣列,若true代表回傳點為物件{x,y,z}之陣列,若false回傳點陣列[x,y,z]之陣列,預設true

Returns:

回傳點{x,y,z}陣列

Type
Array

(static) ptsXYtoArr(ps, optopt) → {Array}

Description:
  • 提取點陣列內之點[0,1]或{x,y}或指定鍵值成為點{x,y}物件陣列

    Unit Test: Github

Source:
Example
let ps
let r

ps = [[243, 206], [233, 225], [21, 325]]
r = ptsXYtoArr(ps)
console.log(r)
// => [
//   { x: 243, y: 206, ind: 0 },
//   { x: 233, y: 225, ind: 1 },
//   { x: 21, y: 325, ind: 2 }
// ]

ps = [{ 'x': 243, 'y': 206 }, { 'x': 233, 'y': 225 }, { 'x': 21, 'y': 325 }]
r = ptsXYtoArr(ps)
console.log(r)
// => [
//   { x: 243, y: 206, ind: 0 },
//   { x: 233, y: 225, ind: 1 },
//   { x: 21, y: 325, ind: 2 }
// ]

ps = [{ 'a': 243, 'b': 206 }, { 'a': 233, 'b': 225 }, { 'a': 21, 'b': 325 }]
r = ptsXYtoArr(ps, { keyX: 'a', keyY: 'b' })
console.log(r)
// => [
//   { x: 243, y: 206, ind: 0 },
//   { x: 233, y: 225, ind: 1 },
//   { x: 21, y: 325, ind: 2 }
// ]
Parameters:
Name Type Attributes Default Description
ps Array

輸入點陣列,為[{x:x1,y:y1},{x:x2,y:y2},...]點物件之陣列,或[[x1,y1],[x2,y2],...]點座標陣列之陣列

opt Object <optional>
{}

輸入設定物件,預設{}

Properties
Name Type Attributes Default Description
keyX String <optional>
'x'

輸入點物件x座標鍵字串,預設'x'

keyY String <optional>
'y'

輸入點物件y座標鍵字串,預設'y'

keyInd String <optional>
'ind'

輸入點物件指標鍵字串,預設'ind'

returnObjArray Boolean <optional>
true

輸入是否回傳物件陣列,若true代表回傳點為物件{x,y}之陣列,若false回傳點陣列[x,y]之陣列,預設true

Returns:

回傳點陣列

Type
Array

(static) ptsXtoArr(ps, optopt) → {Array}

Description:
  • 提取點陣列內之點[0]或{x}或指定鍵值成為點{x}物件陣列

    Unit Test: Github

Source:
Example
let ps
let r

ps = [[243], [233], [21]]
r = ptsXtoArr(ps)
console.log(r)
// => [
//   { x: 243, ind: 0 },
//   { x: 233, ind: 1 },
//   { x: 21, ind: 2 }
// ]

ps = [{ 'x': 243 }, { 'x': 233 }, { 'x': 21 }]
r = ptsXtoArr(ps)
console.log(r)
// => [
//   { x: 243, ind: 0 },
//   { x: 233, ind: 1 },
//   { x: 21, ind: 2 }
// ]

ps = [{ 'a': 243 }, { 'a': 233 }, { 'a': 21 }]
r = ptsXtoArr(ps, { keyX: 'a' })
console.log(r)
// => [
//   { x: 243, ind: 0 },
//   { x: 233, ind: 1 },
//   { x: 21, ind: 2 }
// ]
Parameters:
Name Type Attributes Default Description
ps Array

輸入點陣列,為[{x:x1},{x:x2},...]點物件之陣列,或[[x1],[x2],...]點座標陣列之陣列

opt Object <optional>
{}

輸入設定物件,預設{}

Properties
Name Type Attributes Default Description
keyX String <optional>
'x'

輸入點物件x座標鍵字串,預設'x'

keyInd String <optional>
'ind'

輸入點物件指標鍵字串,預設'ind'

returnObjArray Boolean <optional>
true

輸入是否回傳物件陣列,若true代表回傳點為物件{x}之陣列,若false回傳點陣列[x]之陣列,預設true

Returns:

回傳點陣列

Type
Array

(static) toMultiPoint(v) → {Array}

Description:
  • 轉換點陣列成為MultiPoint

    Unit Test: Github

Source:
Example
let pgs
let r

pgs = [ //ringString
    [0, 0],
    [100, 0],
    [100, 1],
    [0, 1],
    [0, 0], //閉合
]
r = toMultiPoint(pgs)
console.log(JSON.stringify(r))
// => {"type":"Feature","properties":{},"geometry":{"type":"MultiPoint","coordinates":[[0,0],[100,0],[100,1],[0,1],[0,0]]}}

pgs = [ //ringString
    [0, 0],
    [100, 0],
    [100, 1],
    [0, 1],
]
r = toMultiPoint(pgs)
console.log(JSON.stringify(r))
// => {"type":"Feature","properties":{},"geometry":{"type":"MultiPoint","coordinates":[[0,0],[100,0],[100,1],[0,1]]}}

pgs = [ //polygon
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ]
]
r = toMultiPoint(pgs)
console.log(JSON.stringify(r))
// => {"type":"Feature","properties":{},"geometry":{"type":"MultiPoint","coordinates":[[0,0],[100,0],[100,1],[0,1]]}}

pgs = [ //polygon
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = toMultiPoint(pgs)
console.log(JSON.stringify(r))
// => {"type":"Feature","properties":{},"geometry":{"type":"MultiPoint","coordinates":[[0,0],[10,0],[10,1],[0,1]]}}

pgs = [ //polygon
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ],
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = toMultiPoint(pgs)
console.log(JSON.stringify(r))
// => {"type":"Feature","properties":{},"geometry":{"type":"MultiPoint","coordinates":[[0,0],[100,0],[100,1],[0,1],[0,0],[10,0],[10,1],[0,1]]}}

pgs = [ //multiPolygon
    [
        [
            [0, 0],
            [100, 0],
            [100, 1],
            [0, 1],
        ],
        [
            [0, 0],
            [10, 0],
            [10, 1],
            [0, 1],
        ]
    ]
]
r = toMultiPoint(pgs)
console.log(JSON.stringify(r))
// => {"type":"Feature","properties":{},"geometry":{"type":"MultiPoint","coordinates":[[0,0],[100,0],[100,1],[0,1],[0,0],[10,0],[10,1],[0,1]]}}
Parameters:
Name Type Description
v Array

輸入點陣列

Returns:

回傳資料陣列

Type
Array

(static) toMultiPolygon(v, optopt) → {Array}

Description:
  • 轉換RingString、polygon、MultiPolygon成為MultiPolygon

    Unit Test: Github

Source:
Example
let rs
let r

rs = [ //ringString
    [0, 0],
    [100, 0],
    [100, 1],
    [0, 1],
    [0, 0], //閉合
]
r = toMultiPolygon(rs)
console.log(JSON.stringify(r))
// => [[[[0,0],[100,0],[100,1],[0,1],[0,0]]]]

rs = [ //ringString
    [0, 0],
    [100, 0],
    [100, 1],
    [0, 1],
]
r = toMultiPolygon(rs)
console.log(JSON.stringify(r))
// => [[[[0,0],[100,0],[100,1],[0,1]]]]

rs = [ //polygon
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ]
]
r = toMultiPolygon(rs)
console.log(JSON.stringify(r))
// => [[[[0,0],[100,0],[100,1],[0,1]]]]

rs = [ //polygon
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = toMultiPolygon(rs)
console.log(JSON.stringify(r))
// => [[[[0,0],[10,0],[10,1],[0,1]]]]

rs = [ //polygon
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ],
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = toMultiPolygon(rs) //預設polygon轉multiPolygon使用視為polygons, 故其內會是2個polygons
console.log(JSON.stringify(r))
// => [[[[0,0],[100,0],[100,1],[0,1]]],[[[0,0],[10,0],[10,1],[0,1]]]]

rs = [ //polygon
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ],
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = toMultiPolygon(rs, { supposeType: 'ringStrings' }) //polygon轉multiPolygon使用ringStrings
console.log(JSON.stringify(r))
// => [[[[0,0],[100,0],[100,1],[0,1]],[[0,0],[10,0],[10,1],[0,1]]]]

rs = [ //multiPolygon
    [
        [
            [0, 0],
            [100, 0],
            [100, 1],
            [0, 1],
        ],
        [
            [0, 0],
            [10, 0],
            [10, 1],
            [0, 1],
        ]
    ]
]
r = toMultiPolygon(rs)
console.log(JSON.stringify(r))
// => [[[[0,0],[100,0],[100,1],[0,1]],[[0,0],[10,0],[10,1],[0,1]]]]
Parameters:
Name Type Attributes Default Description
v Array

輸入資料陣列

opt Object <optional>
{}

輸入設定物件,預設{}

Properties
Name Type Attributes Default Description
supposeType String <optional>
'polygons'

輸入提取模式字串,當數據座標深度為2時,使用polygons代表每個其內多邊形為獨立polygon,若為ringStrings則表示其內多邊形為交錯的ringString(代表聯集與剔除),預設'polygons'

Returns:

回傳MultiPolygon陣列

Type
Array

(static) toPolygon(v) → {Array}

Description:
  • 轉換RingString、polygon、MultiPolygon成為Polygon

    Unit Test: Github

Source:
Example
let rs
let r

rs = [ //ringString
    [0, 0],
    [100, 0],
    [100, 1],
    [0, 1],
    [0, 0], //閉合
]
r = toPolygon(rs)
console.log(JSON.stringify(r))
// => [[[0,0],[100,0],[100,1],[0,1],[0,0]]]

rs = [ //ringString
    [0, 0],
    [100, 0],
    [100, 1],
    [0, 1],
]
r = toPolygon(rs)
console.log(JSON.stringify(r))
// => [[[0,0],[100,0],[100,1],[0,1]]]

rs = [ //polygon
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ]
]
r = toPolygon(rs)
console.log(JSON.stringify(r))
// => [[[0,0],[100,0],[100,1],[0,1]]]

rs = [ //polygon
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = toPolygon(rs)
console.log(JSON.stringify(r))
// => [[[0,0],[10,0],[10,1],[0,1]]]

rs = [ //polygon
    [
        [0, 0],
        [100, 0],
        [100, 1],
        [0, 1],
    ],
    [
        [0, 0],
        [10, 0],
        [10, 1],
        [0, 1],
    ]
]
r = toPolygon(rs)
console.log(JSON.stringify(r))
// => [[[0,0],[100,0],[100,1],[0,1]],[[0,0],[10,0],[10,1],[0,1]]]

rs = [ //multiPolygon
    [
        [
            [0, 0],
            [100, 0],
            [100, 1],
            [0, 1],
        ],
        [
            [0, 0],
            [10, 0],
            [10, 1],
            [0, 1],
        ]
    ]
]
r = toPolygon(rs)
console.log(JSON.stringify(r))
// => [[[0,0],[100,0],[100,1],[0,1]],[[0,0],[10,0],[10,1],[0,1]]]
Parameters:
Name Type Description
v Array

輸入資料陣列

Returns:

回傳資料陣列

Type
Array