Skip to content

Instantly share code, notes, and snippets.

@jaskiratr
Last active August 4, 2018 05:09
Show Gist options
  • Save jaskiratr/71d0954c5022e4e44cb3f2edc2d4a3b0 to your computer and use it in GitHub Desktop.
Save jaskiratr/71d0954c5022e4e44cb3f2edc2d4a3b0 to your computer and use it in GitHub Desktop.

Revisions

  1. jaskiratr revised this gist Aug 4, 2018. 1 changed file with 17 additions and 9 deletions.
    26 changes: 17 additions & 9 deletions stream-triangles.js
    Original file line number Diff line number Diff line change
    @@ -1,4 +1,3 @@
    // Modified from : https://github.com/Turfjs/turf/blob/master/packages/turf-triangle-grid/index.ts
    "use strict"
    exports.__esModule = true
    var distance_1 = require("@turf/distance")
    @@ -27,6 +26,7 @@ var helpers_1 = require("@turf/helpers")
    */

    var triangleStream = null

    function triangleGridStream(bbox, cellSide, options) {
    return new Promise((resolve, reject) => {
    triangleStream = triangleGridGenerator(bbox, cellSide, options)
    @@ -132,15 +132,23 @@ function* triangleGridGenerator(bbox, cellSide, options) {
    ], options.properties)
    }
    if (options.mask) {
    if (intersect_1["default"](options.mask, cellTriangle1))
    cellTriangle1 = cellTriangle1
    // results.push(cellTriangle1)

    if (intersect_1["default"](options.mask, cellTriangle2))
    cellTriangle2 = cellTriangle2

    yield [cellTriangle1, cellTriangle2]
    // if (intersect_1["default"](options.mask, cellTriangle1))
    // // results.push(cellTriangle1)
    // if (intersect_1["default"](options.mask, cellTriangle2))
    // results.push(cellTriangle2)

    cellTriangle1 = intersect_1["default"](options.mask, cellTriangle1)
    cellTriangle2 = intersect_1["default"](options.mask, cellTriangle2)

    if (typeof(cellTriangle1) !== 'undefined' && typeof(cellTriangle2) !== 'undefined') {
    yield [cellTriangle1, cellTriangle2]
    } else if (typeof(cellTriangle1) !== 'undefined' && typeof(cellTriangle2) === 'undefined') {
    yield [cellTriangle1]
    } else if (typeof(cellTriangle1) === 'undefined' && typeof(cellTriangle2) !== 'undefined') {
    yield [cellTriangle2]
    } else if (typeof(cellTriangle1) === 'undefined' && typeof(cellTriangle2) === 'undefined') {
    yield null
    }
    } else {
    yield [cellTriangle1, cellTriangle2]
    // results.push(cellTriangle1)
  2. jaskiratr created this gist Aug 4, 2018.
    159 changes: 159 additions & 0 deletions stream-triangles.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,159 @@
    // Modified from : https://github.com/Turfjs/turf/blob/master/packages/turf-triangle-grid/index.ts
    "use strict"
    exports.__esModule = true
    var distance_1 = require("@turf/distance")
    var intersect_1 = require("@turf/intersect")
    var helpers_1 = require("@turf/helpers")
    /**
    * Takes a bounding box and a cell depth and returns a set of triangular {@link Polygon|polygons} in a grid.
    *
    * @name triangleGrid
    * @param {Array<number>} bbox extent in [minX, minY, maxX, maxY] order
    * @param {number} cellSide dimension of each cell
    * @param {Object} [options={}] Optional parameters
    * @param {string} [options.units='kilometers'] used in calculating cellSide, can be degrees, radians, miles, or kilometers
    * @param {Feature<Polygon>} [options.mask] if passed a Polygon or MultiPolygon, the grid Points will be created only inside it
    * @param {Object} [options.properties={}] passed to each point of the grid
    * @returns {FeatureCollection<Polygon>} grid of polygons
    * @example
    * var bbox = [-95, 30 ,-85, 40]
    * var cellSide = 50
    * var options = {units: 'miles'}
    *
    * var triangleGrid = turf.triangleGrid(bbox, cellSide, options)
    *
    * //addToMap
    * var addToMap = [triangleGrid]
    */

    var triangleStream = null
    function triangleGridStream(bbox, cellSide, options) {
    return new Promise((resolve, reject) => {
    triangleStream = triangleGridGenerator(bbox, cellSide, options)
    if (triangleStream)
    resolve(triangleStream)
    else
    reject("Failed to generate stream")
    })
    }


    function* triangleGridGenerator(bbox, cellSide, options) {
    if (options === void 0) { options = {} }
    // Containers
    var results = []
    // Input Validation is being handled by Typescript
    // if (cellSide === null || cellSide === undefined) throw new Error('cellSide is required')
    // if (!isNumber(cellSide)) throw new Error('cellSide is invalid')
    // if (!bbox) throw new Error('bbox is required')
    // if (!Array.isArray(bbox)) throw new Error('bbox must be array')
    // if (bbox.length !== 4) throw new Error('bbox must contain 4 numbers')
    // if (mask && ['Polygon', 'MultiPolygon'].indexOf(getType(mask)) === -1) throw new Error('options.mask must be a (Multi)Polygon')
    // Main
    var xFraction = cellSide / (distance_1["default"]([bbox[0], bbox[1]], [bbox[2], bbox[1]], options))
    var cellWidth = xFraction * (bbox[2] - bbox[0])
    var yFraction = cellSide / (distance_1["default"]([bbox[0], bbox[1]], [bbox[0], bbox[3]], options))
    var cellHeight = yFraction * (bbox[3] - bbox[1])
    var xi = 0
    var currentX = bbox[0]
    while (currentX <= bbox[2]) {
    var yi = 0
    var currentY = bbox[1]
    while (currentY <= bbox[3]) {
    var cellTriangle1 = null
    var cellTriangle2 = null
    if (xi % 2 === 0 && yi % 2 === 0) {
    cellTriangle1 = helpers_1.polygon([
    [
    [currentX, currentY],
    [currentX, currentY + cellHeight],
    [currentX + cellWidth, currentY],
    [currentX, currentY]
    ]
    ], options.properties)
    cellTriangle2 = helpers_1.polygon([
    [
    [currentX, currentY + cellHeight],
    [currentX + cellWidth, currentY + cellHeight],
    [currentX + cellWidth, currentY],
    [currentX, currentY + cellHeight]
    ]
    ], options.properties)
    } else if (xi % 2 === 0 && yi % 2 === 1) {
    cellTriangle1 = helpers_1.polygon([
    [
    [currentX, currentY],
    [currentX + cellWidth, currentY + cellHeight],
    [currentX + cellWidth, currentY],
    [currentX, currentY]
    ]
    ], options.properties)
    cellTriangle2 = helpers_1.polygon([
    [
    [currentX, currentY],
    [currentX, currentY + cellHeight],
    [currentX + cellWidth, currentY + cellHeight],
    [currentX, currentY]
    ]
    ], options.properties)
    } else if (yi % 2 === 0 && xi % 2 === 1) {
    cellTriangle1 = helpers_1.polygon([
    [
    [currentX, currentY],
    [currentX, currentY + cellHeight],
    [currentX + cellWidth, currentY + cellHeight],
    [currentX, currentY]
    ]
    ], options.properties)
    cellTriangle2 = helpers_1.polygon([
    [
    [currentX, currentY],
    [currentX + cellWidth, currentY + cellHeight],
    [currentX + cellWidth, currentY],
    [currentX, currentY]
    ]
    ], options.properties)
    } else if (yi % 2 === 1 && xi % 2 === 1) {
    cellTriangle1 = helpers_1.polygon([
    [
    [currentX, currentY],
    [currentX, currentY + cellHeight],
    [currentX + cellWidth, currentY],
    [currentX, currentY]
    ]
    ], options.properties)
    cellTriangle2 = helpers_1.polygon([
    [
    [currentX, currentY + cellHeight],
    [currentX + cellWidth, currentY + cellHeight],
    [currentX + cellWidth, currentY],
    [currentX, currentY + cellHeight]
    ]
    ], options.properties)
    }
    if (options.mask) {
    if (intersect_1["default"](options.mask, cellTriangle1))
    cellTriangle1 = cellTriangle1
    // results.push(cellTriangle1)

    if (intersect_1["default"](options.mask, cellTriangle2))
    cellTriangle2 = cellTriangle2

    yield [cellTriangle1, cellTriangle2]
    // results.push(cellTriangle2)
    } else {
    yield [cellTriangle1, cellTriangle2]
    // results.push(cellTriangle1)
    // results.push(cellTriangle2)
    }
    currentY += cellHeight
    yi++
    }
    xi++
    currentX += cellWidth
    }
    // yield helpers_1.featureCollection([cellTriangle1,cellTriangle2])
    // return helpers_1.featureCollection(results)
    }

    exports["default"] = triangleGridStream