@loaders.gl/gis 3.3.0-alpha.1 → 3.3.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es5/bundle.js +0 -1
- package/dist/es5/bundle.js.map +1 -1
- package/dist/es5/index.js +12 -17
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/lib/binary-to-geojson.js +5 -62
- package/dist/es5/lib/binary-to-geojson.js.map +1 -1
- package/dist/es5/lib/extract-geometry-info.js +8 -43
- package/dist/es5/lib/extract-geometry-info.js.map +1 -1
- package/dist/es5/lib/flat-geojson-to-binary-types.js.map +1 -1
- package/dist/es5/lib/flat-geojson-to-binary.js +30 -59
- package/dist/es5/lib/flat-geojson-to-binary.js.map +1 -1
- package/dist/es5/lib/geojson-to-binary.js +0 -4
- package/dist/es5/lib/geojson-to-binary.js.map +1 -1
- package/dist/es5/lib/geojson-to-flat-geojson.js +4 -30
- package/dist/es5/lib/geojson-to-flat-geojson.js.map +1 -1
- package/dist/es5/lib/transform.js +1 -15
- package/dist/es5/lib/transform.js.map +1 -1
- package/dist/esm/bundle.js +1 -1
- package/dist/esm/bundle.js.map +1 -1
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/binary-to-geojson.js +17 -49
- package/dist/esm/lib/binary-to-geojson.js.map +1 -1
- package/dist/esm/lib/extract-geometry-info.js +1 -19
- package/dist/esm/lib/extract-geometry-info.js.map +1 -1
- package/dist/esm/lib/flat-geojson-to-binary-types.js.map +1 -1
- package/dist/esm/lib/flat-geojson-to-binary.js +21 -30
- package/dist/esm/lib/flat-geojson-to-binary.js.map +1 -1
- package/dist/esm/lib/geojson-to-binary.js +5 -3
- package/dist/esm/lib/geojson-to-binary.js.map +1 -1
- package/dist/esm/lib/geojson-to-flat-geojson.js +7 -19
- package/dist/esm/lib/geojson-to-flat-geojson.js.map +1 -1
- package/dist/esm/lib/transform.js +1 -8
- package/dist/esm/lib/transform.js.map +1 -1
- package/dist/lib/binary-to-geojson.d.ts +1 -1
- package/dist/lib/binary-to-geojson.d.ts.map +1 -1
- package/dist/lib/flat-geojson-to-binary-types.d.ts +4 -4
- package/dist/lib/flat-geojson-to-binary-types.d.ts.map +1 -1
- package/dist/lib/flat-geojson-to-binary.d.ts +1 -1
- package/dist/lib/flat-geojson-to-binary.d.ts.map +1 -1
- package/dist/lib/flat-geojson-to-binary.js +1 -0
- package/dist/lib/geojson-to-binary.d.ts +1 -1
- package/dist/lib/geojson-to-binary.d.ts.map +1 -1
- package/dist/lib/geojson-to-flat-geojson.d.ts +1 -1
- package/dist/lib/geojson-to-flat-geojson.d.ts.map +1 -1
- package/dist/lib/transform.d.ts +1 -1
- package/dist/lib/transform.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/lib/flat-geojson-to-binary.ts +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"geojson-to-flat-geojson.js","names":["geojsonToFlatGeojson","features","options","coordLength","fixRingWinding","map","feature","flattenFeature","flattenPoint","coordinates","data","indices","push","length","i","flattenLineString","c","flattenPolygon","areas","count","ringAreas","polygons","lineString","lineString2d","p","slice","area","getPolygonSignedArea","flat","ccw","reverse","geometry","type","Error"],"sources":["../../../src/lib/geojson-to-flat-geojson.ts"],"sourcesContent":["import {getPolygonSignedArea} from '@math.gl/polygon';\n\nimport {Feature, Position, FlatFeature} from '@loaders.gl/schema';\n\n/**\n * Options for `geojsonToFlatGeojson`\n */\nexport type GeojsonToFlatGeojsonOptions = {\n coordLength: number;\n fixRingWinding: boolean;\n};\n\n// Coordinates defining a Point\ntype PointCoordinates = Position;\n// Coordinates defining a LineString\ntype LineStringCoordinates = Position[];\n// Coordinates defining a Polygon\ntype PolygonCoordinates = Position[][];\n\n/**\n * Convert GeoJSON features to Flat GeoJSON features\n *\n * @param features\n * @param options\n * @returns an Array of Flat GeoJSON features\n */\nexport function geojsonToFlatGeojson(\n features: Feature[],\n options: GeojsonToFlatGeojsonOptions = {coordLength: 2, fixRingWinding: true}\n): FlatFeature[] {\n return features.map((feature) => flattenFeature(feature, options));\n}\n\n/**\n * Helper function to copy Point values from `coordinates` into `data` & `indices`\n *\n * @param coordinates\n * @param data\n * @param indices\n * @param options\n */\nfunction flattenPoint(\n coordinates: PointCoordinates,\n data: number[],\n indices: number[],\n options: GeojsonToFlatGeojsonOptions\n) {\n indices.push(data.length);\n data.push(...coordinates);\n\n // Pad up to coordLength\n for (let i = coordinates.length; i < options.coordLength; i++) {\n data.push(0);\n }\n}\n\n/**\n * Helper function to copy LineString values from `coordinates` into `data` & `indices`\n *\n * @param coordinates\n * @param data\n * @param indices\n * @param options\n */\nfunction flattenLineString(\n coordinates: LineStringCoordinates,\n data: number[],\n indices: number[],\n options: GeojsonToFlatGeojsonOptions\n) {\n indices.push(data.length);\n for (const c of coordinates) {\n data.push(...c);\n\n // Pad up to coordLength\n for (let i = c.length; i < options.coordLength; i++) {\n data.push(0);\n }\n }\n}\n\n/**\n * Helper function to copy Polygon values from `coordinates` into `data` & `indices` & `areas`\n *\n * @param coordinates\n * @param data\n * @param indices\n * @param areas\n * @param options\n */\nfunction flattenPolygon(\n coordinates: PolygonCoordinates,\n data: number[],\n indices: number[][],\n areas: number[][],\n options: GeojsonToFlatGeojsonOptions\n) {\n let count = 0;\n const ringAreas: number[] = [];\n const polygons: number[] = [];\n for (const lineString of coordinates) {\n const lineString2d = lineString.map((p) => p.slice(0, 2));\n let area = getPolygonSignedArea(lineString2d.flat());\n const ccw = area < 0;\n\n // Exterior ring must be CCW and interior rings CW\n if (options.fixRingWinding && ((count === 0 && !ccw) || (count > 0 && ccw))) {\n lineString.reverse();\n area = -area;\n }\n ringAreas.push(area);\n flattenLineString(lineString, data, polygons, options);\n count++;\n }\n\n if (count > 0) {\n areas.push(ringAreas);\n indices.push(polygons);\n }\n}\n\n/**\n * Flatten single GeoJSON feature into Flat GeoJSON\n *\n * @param feature\n * @param options\n * @returns A Flat GeoJSON feature\n */\nfunction flattenFeature(feature: Feature, options: GeojsonToFlatGeojsonOptions): FlatFeature {\n const {geometry} = feature;\n if (geometry.type === 'GeometryCollection') {\n throw new Error('GeometryCollection type not supported');\n }\n const data = [];\n const indices = [];\n let areas;\n let type;\n\n switch (geometry.type) {\n case 'Point':\n type = 'Point';\n flattenPoint(geometry.coordinates, data, indices, options);\n break;\n case 'MultiPoint':\n type = 'Point';\n geometry.coordinates.map((c) => flattenPoint(c, data, indices, options));\n break;\n case 'LineString':\n type = 'LineString';\n flattenLineString(geometry.coordinates, data, indices, options);\n break;\n case 'MultiLineString':\n type = 'LineString';\n geometry.coordinates.map((c) => flattenLineString(c, data, indices, options));\n break;\n case 'Polygon':\n type = 'Polygon';\n areas = [];\n flattenPolygon(geometry.coordinates, data, indices, areas, options);\n break;\n case 'MultiPolygon':\n type = 'Polygon';\n areas = [];\n geometry.coordinates.map((c) => flattenPolygon(c, data, indices, areas, options));\n break;\n default:\n throw new Error(`Unknown type: ${type}`);\n }\n\n return {...feature, geometry: {type, indices, data, areas}};\n}\n"],"mappings":"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"}
|
|
@@ -5,35 +5,26 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.transformBinaryCoords = transformBinaryCoords;
|
|
7
7
|
exports.transformGeoJsonCoords = transformGeoJsonCoords;
|
|
8
|
-
|
|
9
8
|
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
10
|
-
|
|
11
9
|
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
12
|
-
|
|
13
10
|
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
14
|
-
|
|
15
11
|
function transformBinaryCoords(binaryFeatures, transformCoordinate) {
|
|
16
12
|
if (binaryFeatures.points) {
|
|
17
13
|
transformBinaryGeometryPositions(binaryFeatures.points, transformCoordinate);
|
|
18
14
|
}
|
|
19
|
-
|
|
20
15
|
if (binaryFeatures.lines) {
|
|
21
16
|
transformBinaryGeometryPositions(binaryFeatures.lines, transformCoordinate);
|
|
22
17
|
}
|
|
23
|
-
|
|
24
18
|
if (binaryFeatures.polygons) {
|
|
25
19
|
transformBinaryGeometryPositions(binaryFeatures.polygons, transformCoordinate);
|
|
26
20
|
}
|
|
27
|
-
|
|
28
21
|
return binaryFeatures;
|
|
29
22
|
}
|
|
30
23
|
|
|
31
24
|
function transformBinaryGeometryPositions(binaryGeometry, fn) {
|
|
32
25
|
var positions = binaryGeometry.positions;
|
|
33
|
-
|
|
34
26
|
for (var i = 0; i < positions.value.length; i += positions.size) {
|
|
35
27
|
var _coord = Array.from(positions.value.subarray(i, i + positions.size));
|
|
36
|
-
|
|
37
28
|
var transformedCoord = fn(_coord);
|
|
38
29
|
positions.value.set(transformedCoord, i);
|
|
39
30
|
}
|
|
@@ -41,8 +32,7 @@ function transformBinaryGeometryPositions(binaryGeometry, fn) {
|
|
|
41
32
|
|
|
42
33
|
function transformGeoJsonCoords(features, fn) {
|
|
43
34
|
var _iterator = _createForOfIteratorHelper(features),
|
|
44
|
-
|
|
45
|
-
|
|
35
|
+
_step;
|
|
46
36
|
try {
|
|
47
37
|
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
48
38
|
var feature = _step.value;
|
|
@@ -53,20 +43,16 @@ function transformGeoJsonCoords(features, fn) {
|
|
|
53
43
|
} finally {
|
|
54
44
|
_iterator.f();
|
|
55
45
|
}
|
|
56
|
-
|
|
57
46
|
return features;
|
|
58
47
|
}
|
|
59
|
-
|
|
60
48
|
function coordMap(array, fn) {
|
|
61
49
|
if (isCoord(array)) {
|
|
62
50
|
return fn(array);
|
|
63
51
|
}
|
|
64
|
-
|
|
65
52
|
return array.map(function (item) {
|
|
66
53
|
return coordMap(item, fn);
|
|
67
54
|
});
|
|
68
55
|
}
|
|
69
|
-
|
|
70
56
|
function isCoord(array) {
|
|
71
57
|
return Number.isFinite(array[0]) && Number.isFinite(array[1]);
|
|
72
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"transform.js","names":["transformBinaryCoords","binaryFeatures","transformCoordinate","points","transformBinaryGeometryPositions","lines","polygons","binaryGeometry","fn","positions","i","value","length","size","coord","Array","from","subarray","transformedCoord","set","transformGeoJsonCoords","features","feature","geometry","coordinates","coordMap","array","isCoord","map","item","Number","isFinite"],"sources":["../../../src/lib/transform.ts"],"sourcesContent":["import type {BinaryFeatures, BinaryGeometry} from '@loaders.gl/schema';\n\ntype TransformCoordinate = (coord: number[]) => number[];\n\n/**\n * Apply transformation to every coordinate of binary features\n * @param binaryFeatures binary features\n * @param transformCoordinate Function to call on each coordinate\n * @return Transformed binary features\n */\nexport function transformBinaryCoords(\n binaryFeatures: BinaryFeatures,\n transformCoordinate: TransformCoordinate\n): BinaryFeatures {\n if (binaryFeatures.points) {\n transformBinaryGeometryPositions(binaryFeatures.points, transformCoordinate);\n }\n if (binaryFeatures.lines) {\n transformBinaryGeometryPositions(binaryFeatures.lines, transformCoordinate);\n }\n if (binaryFeatures.polygons) {\n transformBinaryGeometryPositions(binaryFeatures.polygons, transformCoordinate);\n }\n return binaryFeatures;\n}\n\n/** Transform one binary geometry */\nfunction transformBinaryGeometryPositions(binaryGeometry: BinaryGeometry, fn: TransformCoordinate) {\n const {positions} = binaryGeometry;\n for (let i = 0; i < positions.value.length; i += positions.size) {\n // @ts-ignore inclusion of bigint causes problems\n const coord: Array<number> = Array.from(positions.value.subarray(i, i + positions.size));\n const transformedCoord = fn(coord);\n // @ts-ignore typescript typing for .set seems to require bigint?\n positions.value.set(transformedCoord, i);\n }\n}\n\n/**\n * Apply transformation to every coordinate of GeoJSON features\n *\n * @param features Array of GeoJSON features\n * @param fn Function to call on each coordinate\n * @return Transformed GeoJSON features\n */\nexport function transformGeoJsonCoords(\n features: object[],\n fn: (coord: number[]) => number[]\n): object[] {\n for (const feature of features) {\n // @ts-ignore\n feature.geometry.coordinates = coordMap(feature.geometry.coordinates, fn);\n }\n return features;\n}\n\nfunction coordMap(array, fn) {\n if (isCoord(array)) {\n return fn(array);\n }\n\n return array.map((item) => {\n return coordMap(item, fn);\n });\n}\n\nfunction isCoord(array) {\n return Number.isFinite(array[0]) && Number.isFinite(array[1]);\n}\n"],"mappings":";;;;;;;;;;AAUO,SAASA,qBAAqB,CACnCC,cAA8B,EAC9BC,mBAAwC,EACxB;EAChB,IAAID,cAAc,CAACE,MAAM,EAAE;IACzBC,gCAAgC,CAACH,cAAc,CAACE,MAAM,EAAED,mBAAmB,CAAC;EAC9E;EACA,IAAID,cAAc,CAACI,KAAK,EAAE;IACxBD,gCAAgC,CAACH,cAAc,CAACI,KAAK,EAAEH,mBAAmB,CAAC;EAC7E;EACA,IAAID,cAAc,CAACK,QAAQ,EAAE;IAC3BF,gCAAgC,CAACH,cAAc,CAACK,QAAQ,EAAEJ,mBAAmB,CAAC;EAChF;EACA,OAAOD,cAAc;AACvB;;AAGA,SAASG,gCAAgC,CAACG,cAA8B,EAAEC,EAAuB,EAAE;EACjG,IAAOC,SAAS,GAAIF,cAAc,CAA3BE,SAAS;EAChB,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGD,SAAS,CAACE,KAAK,CAACC,MAAM,EAAEF,CAAC,IAAID,SAAS,CAACI,IAAI,EAAE;IAE/D,IAAMC,MAAoB,GAAGC,KAAK,CAACC,IAAI,CAACP,SAAS,CAACE,KAAK,CAACM,QAAQ,CAACP,CAAC,EAAEA,CAAC,GAAGD,SAAS,CAACI,IAAI,CAAC,CAAC;IACxF,IAAMK,gBAAgB,GAAGV,EAAE,CAACM,MAAK,CAAC;IAElCL,SAAS,CAACE,KAAK,CAACQ,GAAG,CAACD,gBAAgB,EAAER,CAAC,CAAC;EAC1C;AACF;;AASO,SAASU,sBAAsB,CACpCC,QAAkB,EAClBb,EAAiC,EACvB;EAAA,2CACYa,QAAQ;IAAA;EAAA;IAA9B,oDAAgC;MAAA,IAArBC,OAAO;MAEhBA,OAAO,CAACC,QAAQ,CAACC,WAAW,GAAGC,QAAQ,CAACH,OAAO,CAACC,QAAQ,CAACC,WAAW,EAAEhB,EAAE,CAAC;IAC3E;EAAC;IAAA;EAAA;IAAA;EAAA;EACD,OAAOa,QAAQ;AACjB;AAEA,SAASI,QAAQ,CAACC,KAAK,EAAElB,EAAE,EAAE;EAC3B,IAAImB,OAAO,CAACD,KAAK,CAAC,EAAE;IAClB,OAAOlB,EAAE,CAACkB,KAAK,CAAC;EAClB;EAEA,OAAOA,KAAK,CAACE,GAAG,CAAC,UAACC,IAAI,EAAK;IACzB,OAAOJ,QAAQ,CAACI,IAAI,EAAErB,EAAE,CAAC;EAC3B,CAAC,CAAC;AACJ;AAEA,SAASmB,OAAO,CAACD,KAAK,EAAE;EACtB,OAAOI,MAAM,CAACC,QAAQ,CAACL,KAAK,CAAC,CAAC,CAAC,CAAC,IAAII,MAAM,CAACC,QAAQ,CAACL,KAAK,CAAC,CAAC,CAAC,CAAC;AAC/D"}
|
package/dist/esm/bundle.js
CHANGED
package/dist/esm/bundle.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"bundle.js","names":["moduleExports","require","globalThis","loaders","module","exports","Object","assign"],"sources":["../../src/bundle.ts"],"sourcesContent":["// @ts-nocheck\nconst moduleExports = require('./index');\nglobalThis.loaders = globalThis.loaders || {};\nmodule.exports = Object.assign(globalThis.loaders, moduleExports);\n"],"mappings":";AACA,MAAMA,aAAa,GAAGC,OAAO,CAAC,SAAS,CAAC;AACxCC,UAAU,CAACC,OAAO,GAAGD,UAAU,CAACC,OAAO,IAAI,CAAC,CAAC;AAC7CC,MAAM,CAACC,OAAO,GAAGC,MAAM,CAACC,MAAM,CAACL,UAAU,CAACC,OAAO,EAAEH,aAAa,CAAC"}
|
package/dist/esm/index.js
CHANGED
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"index.js","names":["flatGeojsonToBinary","geojsonToBinary","geojsonToFlatGeojson","binaryToGeojson","binaryToGeoJson","binaryToGeometry","transformBinaryCoords","transformGeoJsonCoords"],"sources":["../../src/index.ts"],"sourcesContent":["// Types from `@loaders.gl/schema`\n\n// Functions\nexport {flatGeojsonToBinary} from './lib/flat-geojson-to-binary';\nexport {geojsonToBinary} from './lib/geojson-to-binary';\nexport {geojsonToFlatGeojson} from './lib/geojson-to-flat-geojson';\nexport {binaryToGeojson, binaryToGeoJson, binaryToGeometry} from './lib/binary-to-geojson';\nexport {transformBinaryCoords, transformGeoJsonCoords} from './lib/transform';\n"],"mappings":";;AAGA,SAAQA,mBAAmB,QAAO,8BAA8B;AAChE,SAAQC,eAAe,QAAO,yBAAyB;AACvD,SAAQC,oBAAoB,QAAO,+BAA+B;AAClE,SAAQC,eAAe,EAAEC,eAAe,EAAEC,gBAAgB,QAAO,yBAAyB;AAC1F,SAAQC,qBAAqB,EAAEC,sBAAsB,QAAO,iBAAiB"}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
1
3
|
export function binaryToGeojson(data, options) {
|
|
2
4
|
const globalFeatureId = options === null || options === void 0 ? void 0 : options.globalFeatureId;
|
|
3
|
-
|
|
4
5
|
if (globalFeatureId !== undefined) {
|
|
5
6
|
return getSingleFeature(data, globalFeatureId);
|
|
6
7
|
}
|
|
7
|
-
|
|
8
8
|
return parseFeatures(data, options === null || options === void 0 ? void 0 : options.type);
|
|
9
9
|
}
|
|
10
|
-
|
|
10
|
+
|
|
11
|
+
export function binaryToGeoJson(data, type) {
|
|
12
|
+
let format = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'feature';
|
|
11
13
|
switch (format) {
|
|
12
14
|
case 'feature':
|
|
13
15
|
return parseFeatures(data, type);
|
|
14
|
-
|
|
15
16
|
case 'geometry':
|
|
16
17
|
return binaryToGeometry(data);
|
|
17
|
-
|
|
18
18
|
default:
|
|
19
19
|
throw new Error(format);
|
|
20
20
|
}
|
|
@@ -22,34 +22,27 @@ export function binaryToGeoJson(data, type, format = 'feature') {
|
|
|
22
22
|
|
|
23
23
|
function getSingleFeature(data, globalFeatureId) {
|
|
24
24
|
const dataArray = normalizeInput(data);
|
|
25
|
-
|
|
26
25
|
for (const data of dataArray) {
|
|
27
26
|
let lastIndex = 0;
|
|
28
27
|
let lastValue = data.featureIds.value[0];
|
|
29
28
|
|
|
30
29
|
for (let i = 0; i < data.featureIds.value.length; i++) {
|
|
31
30
|
const currValue = data.featureIds.value[i];
|
|
32
|
-
|
|
33
31
|
if (currValue === lastValue) {
|
|
34
32
|
continue;
|
|
35
33
|
}
|
|
36
|
-
|
|
37
34
|
if (globalFeatureId === data.globalFeatureIds.value[lastIndex]) {
|
|
38
35
|
return parseFeature(data, lastIndex, i);
|
|
39
36
|
}
|
|
40
|
-
|
|
41
37
|
lastIndex = i;
|
|
42
38
|
lastValue = currValue;
|
|
43
39
|
}
|
|
44
|
-
|
|
45
40
|
if (globalFeatureId === data.globalFeatureIds.value[lastIndex]) {
|
|
46
41
|
return parseFeature(data, lastIndex, data.featureIds.value.length);
|
|
47
42
|
}
|
|
48
43
|
}
|
|
49
|
-
|
|
50
44
|
throw new Error("featureId:".concat(globalFeatureId, " not found"));
|
|
51
45
|
}
|
|
52
|
-
|
|
53
46
|
function parseFeatures(data, type) {
|
|
54
47
|
const dataArray = normalizeInput(data, type);
|
|
55
48
|
return parseFeatureCollection(dataArray);
|
|
@@ -59,65 +52,51 @@ export function binaryToGeometry(data, startIndex, endIndex) {
|
|
|
59
52
|
switch (data.type) {
|
|
60
53
|
case 'Point':
|
|
61
54
|
return pointToGeoJson(data, startIndex, endIndex);
|
|
62
|
-
|
|
63
55
|
case 'LineString':
|
|
64
56
|
return lineStringToGeoJson(data, startIndex, endIndex);
|
|
65
|
-
|
|
66
57
|
case 'Polygon':
|
|
67
58
|
return polygonToGeoJson(data, startIndex, endIndex);
|
|
68
|
-
|
|
69
59
|
default:
|
|
70
60
|
const unexpectedInput = data;
|
|
71
61
|
throw new Error("Unsupported geometry type: ".concat(unexpectedInput === null || unexpectedInput === void 0 ? void 0 : unexpectedInput.type));
|
|
72
62
|
}
|
|
73
63
|
}
|
|
74
|
-
|
|
75
64
|
function normalizeInput(data, type) {
|
|
76
65
|
const isHeterogeneousType = Boolean(data.points || data.lines || data.polygons);
|
|
77
|
-
|
|
78
66
|
if (!isHeterogeneousType) {
|
|
79
67
|
data.type = type || parseType(data);
|
|
80
68
|
return [data];
|
|
81
69
|
}
|
|
82
|
-
|
|
83
70
|
const features = [];
|
|
84
|
-
|
|
85
71
|
if (data.points) {
|
|
86
72
|
data.points.type = 'Point';
|
|
87
73
|
features.push(data.points);
|
|
88
74
|
}
|
|
89
|
-
|
|
90
75
|
if (data.lines) {
|
|
91
76
|
data.lines.type = 'LineString';
|
|
92
77
|
features.push(data.lines);
|
|
93
78
|
}
|
|
94
|
-
|
|
95
79
|
if (data.polygons) {
|
|
96
80
|
data.polygons.type = 'Polygon';
|
|
97
81
|
features.push(data.polygons);
|
|
98
82
|
}
|
|
99
|
-
|
|
100
83
|
return features;
|
|
101
84
|
}
|
|
102
85
|
|
|
103
86
|
function parseFeatureCollection(dataArray) {
|
|
104
87
|
const features = [];
|
|
105
|
-
|
|
106
88
|
for (const data of dataArray) {
|
|
107
89
|
if (data.featureIds.value.length === 0) {
|
|
108
90
|
continue;
|
|
109
91
|
}
|
|
110
|
-
|
|
111
92
|
let lastIndex = 0;
|
|
112
93
|
let lastValue = data.featureIds.value[0];
|
|
113
94
|
|
|
114
95
|
for (let i = 0; i < data.featureIds.value.length; i++) {
|
|
115
96
|
const currValue = data.featureIds.value[i];
|
|
116
|
-
|
|
117
97
|
if (currValue === lastValue) {
|
|
118
98
|
continue;
|
|
119
99
|
}
|
|
120
|
-
|
|
121
100
|
features.push(parseFeature(data, lastIndex, i));
|
|
122
101
|
lastIndex = i;
|
|
123
102
|
lastValue = currValue;
|
|
@@ -125,7 +104,6 @@ function parseFeatureCollection(dataArray) {
|
|
|
125
104
|
|
|
126
105
|
features.push(parseFeature(data, lastIndex, data.featureIds.value.length));
|
|
127
106
|
}
|
|
128
|
-
|
|
129
107
|
return features;
|
|
130
108
|
}
|
|
131
109
|
|
|
@@ -141,21 +119,25 @@ function parseFeature(data, startIndex, endIndex) {
|
|
|
141
119
|
};
|
|
142
120
|
}
|
|
143
121
|
|
|
144
|
-
function parseFields(data
|
|
122
|
+
function parseFields(data) {
|
|
123
|
+
let startIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
|
124
|
+
let endIndex = arguments.length > 2 ? arguments[2] : undefined;
|
|
145
125
|
return data.fields && data.fields[data.featureIds.value[startIndex]];
|
|
146
126
|
}
|
|
147
127
|
|
|
148
|
-
function parseProperties(data
|
|
128
|
+
function parseProperties(data) {
|
|
129
|
+
let startIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
|
130
|
+
let endIndex = arguments.length > 2 ? arguments[2] : undefined;
|
|
149
131
|
const properties = Object.assign({}, data.properties[data.featureIds.value[startIndex]]);
|
|
150
|
-
|
|
151
132
|
for (const key in data.numericProps) {
|
|
152
133
|
properties[key] = data.numericProps[key].value[startIndex];
|
|
153
134
|
}
|
|
154
|
-
|
|
155
135
|
return properties;
|
|
156
136
|
}
|
|
157
137
|
|
|
158
|
-
function polygonToGeoJson(data
|
|
138
|
+
function polygonToGeoJson(data) {
|
|
139
|
+
let startIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -Infinity;
|
|
140
|
+
let endIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Infinity;
|
|
159
141
|
const {
|
|
160
142
|
positions
|
|
161
143
|
} = data;
|
|
@@ -165,14 +147,12 @@ function polygonToGeoJson(data, startIndex = -Infinity, endIndex = Infinity) {
|
|
|
165
147
|
|
|
166
148
|
if (!multi) {
|
|
167
149
|
const coordinates = [];
|
|
168
|
-
|
|
169
150
|
for (let i = 0; i < primitivePolygonIndices.length - 1; i++) {
|
|
170
151
|
const startRingIndex = primitivePolygonIndices[i];
|
|
171
152
|
const endRingIndex = primitivePolygonIndices[i + 1];
|
|
172
153
|
const ringCoordinates = ringToGeoJson(positions, startRingIndex, endRingIndex);
|
|
173
154
|
coordinates.push(ringCoordinates);
|
|
174
155
|
}
|
|
175
|
-
|
|
176
156
|
return {
|
|
177
157
|
type: 'Polygon',
|
|
178
158
|
coordinates
|
|
@@ -180,27 +160,26 @@ function polygonToGeoJson(data, startIndex = -Infinity, endIndex = Infinity) {
|
|
|
180
160
|
}
|
|
181
161
|
|
|
182
162
|
const coordinates = [];
|
|
183
|
-
|
|
184
163
|
for (let i = 0; i < polygonIndices.length - 1; i++) {
|
|
185
164
|
const startPolygonIndex = polygonIndices[i];
|
|
186
165
|
const endPolygonIndex = polygonIndices[i + 1];
|
|
187
166
|
const polygonCoordinates = polygonToGeoJson(data, startPolygonIndex, endPolygonIndex).coordinates;
|
|
188
167
|
coordinates.push(polygonCoordinates);
|
|
189
168
|
}
|
|
190
|
-
|
|
191
169
|
return {
|
|
192
170
|
type: 'MultiPolygon',
|
|
193
171
|
coordinates
|
|
194
172
|
};
|
|
195
173
|
}
|
|
196
174
|
|
|
197
|
-
function lineStringToGeoJson(data
|
|
175
|
+
function lineStringToGeoJson(data) {
|
|
176
|
+
let startIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -Infinity;
|
|
177
|
+
let endIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Infinity;
|
|
198
178
|
const {
|
|
199
179
|
positions
|
|
200
180
|
} = data;
|
|
201
181
|
const pathIndices = data.pathIndices.value.filter(x => x >= startIndex && x <= endIndex);
|
|
202
182
|
const multi = pathIndices.length > 2;
|
|
203
|
-
|
|
204
183
|
if (!multi) {
|
|
205
184
|
const coordinates = ringToGeoJson(positions, pathIndices[0], pathIndices[1]);
|
|
206
185
|
return {
|
|
@@ -208,14 +187,11 @@ function lineStringToGeoJson(data, startIndex = -Infinity, endIndex = Infinity)
|
|
|
208
187
|
coordinates
|
|
209
188
|
};
|
|
210
189
|
}
|
|
211
|
-
|
|
212
190
|
const coordinates = [];
|
|
213
|
-
|
|
214
191
|
for (let i = 0; i < pathIndices.length - 1; i++) {
|
|
215
192
|
const ringCoordinates = ringToGeoJson(positions, pathIndices[i], pathIndices[i + 1]);
|
|
216
193
|
coordinates.push(ringCoordinates);
|
|
217
194
|
}
|
|
218
|
-
|
|
219
195
|
return {
|
|
220
196
|
type: 'MultiLineString',
|
|
221
197
|
coordinates
|
|
@@ -228,14 +204,12 @@ function pointToGeoJson(data, startIndex, endIndex) {
|
|
|
228
204
|
} = data;
|
|
229
205
|
const coordinates = ringToGeoJson(positions, startIndex, endIndex);
|
|
230
206
|
const multi = coordinates.length > 1;
|
|
231
|
-
|
|
232
207
|
if (multi) {
|
|
233
208
|
return {
|
|
234
209
|
type: 'MultiPoint',
|
|
235
210
|
coordinates
|
|
236
211
|
};
|
|
237
212
|
}
|
|
238
|
-
|
|
239
213
|
return {
|
|
240
214
|
type: 'Point',
|
|
241
215
|
coordinates: coordinates[0]
|
|
@@ -246,17 +220,13 @@ function ringToGeoJson(positions, startIndex, endIndex) {
|
|
|
246
220
|
startIndex = startIndex || 0;
|
|
247
221
|
endIndex = endIndex || positions.value.length / positions.size;
|
|
248
222
|
const ringCoordinates = [];
|
|
249
|
-
|
|
250
223
|
for (let j = startIndex; j < endIndex; j++) {
|
|
251
224
|
const coord = Array();
|
|
252
|
-
|
|
253
225
|
for (let k = j * positions.size; k < (j + 1) * positions.size; k++) {
|
|
254
226
|
coord.push(Number(positions.value[k]));
|
|
255
227
|
}
|
|
256
|
-
|
|
257
228
|
ringCoordinates.push(coord);
|
|
258
229
|
}
|
|
259
|
-
|
|
260
230
|
return ringCoordinates;
|
|
261
231
|
}
|
|
262
232
|
|
|
@@ -264,11 +234,9 @@ function parseType(data) {
|
|
|
264
234
|
if (data.pathIndices) {
|
|
265
235
|
return 'LineString';
|
|
266
236
|
}
|
|
267
|
-
|
|
268
237
|
if (data.polygonIndices) {
|
|
269
238
|
return 'Polygon';
|
|
270
239
|
}
|
|
271
|
-
|
|
272
240
|
return 'Point';
|
|
273
241
|
}
|
|
274
242
|
//# sourceMappingURL=binary-to-geojson.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/binary-to-geojson.ts"],"names":["binaryToGeojson","data","options","globalFeatureId","undefined","getSingleFeature","parseFeatures","type","binaryToGeoJson","format","binaryToGeometry","Error","dataArray","normalizeInput","lastIndex","lastValue","featureIds","value","i","length","currValue","globalFeatureIds","parseFeature","parseFeatureCollection","startIndex","endIndex","pointToGeoJson","lineStringToGeoJson","polygonToGeoJson","unexpectedInput","isHeterogeneousType","Boolean","points","lines","polygons","parseType","features","push","geometry","properties","parseProperties","fields","parseFields","Object","assign","key","numericProps","Infinity","positions","polygonIndices","filter","x","primitivePolygonIndices","multi","coordinates","startRingIndex","endRingIndex","ringCoordinates","ringToGeoJson","startPolygonIndex","endPolygonIndex","polygonCoordinates","pathIndices","size","j","coord","Array","k","Number"],"mappings":"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","sourcesContent":["import type {\n BinaryGeometry,\n BinaryFeatures,\n BinaryGeometryType,\n BinaryPointFeatures,\n BinaryLineFeatures,\n BinaryPolygonFeatures,\n BinaryAttribute\n} from '@loaders.gl/schema';\nimport type {Feature, Geometry, Position, GeoJsonProperties} from '@loaders.gl/schema';\nimport type {\n Point,\n MultiPoint,\n LineString,\n MultiLineString,\n Polygon,\n MultiPolygon\n} from '@loaders.gl/schema';\n\n// Note:L We do not handle GeometryCollection, define a limited Geometry type that always has coordinates.\n// type FeatureGeometry = Point | MultiPoint | LineString | MultiLineString | Polygon | MultiPolygon;\n\ntype BinaryToGeoJsonOptions = {\n type?: BinaryGeometryType;\n globalFeatureId?: number;\n};\n\n/**\n * Convert binary geometry representation to GeoJSON\n * @param data geometry data in binary representation\n * @param options\n * @param options.type Input data type: Point, LineString, or Polygon\n * @param options.featureId Global feature id. If specified, only a single feature is extracted\n * @return GeoJSON objects\n */\nexport function binaryToGeojson(\n data: BinaryFeatures,\n options?: BinaryToGeoJsonOptions\n): Feature[] | Feature {\n const globalFeatureId = options?.globalFeatureId;\n if (globalFeatureId !== undefined) {\n return getSingleFeature(data, globalFeatureId);\n }\n return parseFeatures(data, options?.type);\n}\n\n/** @deprecated use `binaryToGeojson` or `binaryToGeometry` instead */\nexport function binaryToGeoJson(\n data: BinaryGeometry | BinaryFeatures,\n type?: BinaryGeometryType,\n format: 'feature' | 'geometry' = 'feature'\n): Geometry | Feature[] {\n switch (format) {\n case 'feature':\n return parseFeatures(data as BinaryFeatures, type);\n case 'geometry':\n return binaryToGeometry(data as BinaryGeometry);\n default:\n throw new Error(format);\n }\n}\n\n/**\n * Return a single feature from a binary geometry representation as GeoJSON\n * @param data geometry data in binary representation\n * @return GeoJSON feature\n */\nfunction getSingleFeature(data: BinaryFeatures, globalFeatureId: number): Feature {\n const dataArray = normalizeInput(data);\n for (const data of dataArray) {\n let lastIndex = 0;\n let lastValue = data.featureIds.value[0];\n\n // Scan through data until we find matching feature\n for (let i = 0; i < data.featureIds.value.length; i++) {\n const currValue = data.featureIds.value[i];\n if (currValue === lastValue) {\n // eslint-disable-next-line no-continue\n continue;\n }\n if (globalFeatureId === data.globalFeatureIds.value[lastIndex]) {\n return parseFeature(data, lastIndex, i);\n }\n lastIndex = i;\n lastValue = currValue;\n }\n\n if (globalFeatureId === data.globalFeatureIds.value[lastIndex]) {\n return parseFeature(data, lastIndex, data.featureIds.value.length);\n }\n }\n\n throw new Error(`featureId:${globalFeatureId} not found`);\n}\n\nfunction parseFeatures(data: BinaryFeatures, type?: BinaryGeometryType): Feature[] {\n const dataArray = normalizeInput(data, type);\n return parseFeatureCollection(dataArray);\n}\n\n/** Parse input binary data and return a valid GeoJSON geometry object */\nexport function binaryToGeometry(\n data: BinaryGeometry,\n startIndex?: number,\n endIndex?: number\n): Geometry {\n switch (data.type) {\n case 'Point':\n return pointToGeoJson(data, startIndex, endIndex);\n case 'LineString':\n return lineStringToGeoJson(data, startIndex, endIndex);\n case 'Polygon':\n return polygonToGeoJson(data, startIndex, endIndex);\n default:\n const unexpectedInput: never = data;\n throw new Error(`Unsupported geometry type: ${(unexpectedInput as any)?.type}`);\n }\n}\n\ntype BinaryFeature = BinaryPointFeatures | BinaryLineFeatures | BinaryPolygonFeatures;\ntype BinaryFeaturesArray = BinaryFeature[];\n\n// Normalize features\n// Return an array of data objects, each of which have a type key\nfunction normalizeInput(data: BinaryFeatures, type?: BinaryGeometryType): BinaryFeaturesArray {\n const isHeterogeneousType = Boolean(data.points || data.lines || data.polygons);\n\n if (!isHeterogeneousType) {\n // @ts-expect-error This is a legacy check which allowed `data` to be an instance of the values\n // here. Aka the new data.points, data.lines, or data.polygons.\n data.type = type || parseType(data);\n return [data] as BinaryFeaturesArray;\n }\n\n const features: BinaryFeaturesArray = [];\n if (data.points) {\n data.points.type = 'Point';\n features.push(data.points);\n }\n if (data.lines) {\n data.lines.type = 'LineString';\n features.push(data.lines);\n }\n if (data.polygons) {\n data.polygons.type = 'Polygon';\n features.push(data.polygons);\n }\n\n return features;\n}\n\n/** Parse input binary data and return an array of GeoJSON Features */\nfunction parseFeatureCollection(dataArray): Feature[] {\n const features: Feature[] = [];\n for (const data of dataArray) {\n if (data.featureIds.value.length === 0) {\n // eslint-disable-next-line no-continue\n continue;\n }\n let lastIndex = 0;\n let lastValue = data.featureIds.value[0];\n\n // Need to deduce start, end indices of each feature\n for (let i = 0; i < data.featureIds.value.length; i++) {\n const currValue = data.featureIds.value[i];\n if (currValue === lastValue) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n features.push(parseFeature(data, lastIndex, i));\n lastIndex = i;\n lastValue = currValue;\n }\n\n // Last feature\n features.push(parseFeature(data, lastIndex, data.featureIds.value.length));\n }\n return features;\n}\n\n/** Parse input binary data and return a single GeoJSON Feature */\nfunction parseFeature(data, startIndex?: number, endIndex?: number): Feature {\n const geometry = binaryToGeometry(data, startIndex, endIndex);\n const properties = parseProperties(data, startIndex, endIndex);\n const fields = parseFields(data, startIndex, endIndex);\n return {type: 'Feature', geometry, properties, ...fields};\n}\n\n/** Parse input binary data and return an object of fields */\nfunction parseFields(data, startIndex: number = 0, endIndex?: number): GeoJsonProperties {\n return data.fields && data.fields[data.featureIds.value[startIndex]];\n}\n\n/** Parse input binary data and return an object of properties */\nfunction parseProperties(data, startIndex: number = 0, endIndex?: number): GeoJsonProperties {\n const properties = Object.assign({}, data.properties[data.featureIds.value[startIndex]]);\n for (const key in data.numericProps) {\n properties[key] = data.numericProps[key].value[startIndex];\n }\n return properties;\n}\n\n/** Parse binary data of type Polygon */\nfunction polygonToGeoJson(\n data,\n startIndex: number = -Infinity,\n endIndex: number = Infinity\n): Polygon | MultiPolygon {\n const {positions} = data;\n const polygonIndices = data.polygonIndices.value.filter((x) => x >= startIndex && x <= endIndex);\n const primitivePolygonIndices = data.primitivePolygonIndices.value.filter(\n (x) => x >= startIndex && x <= endIndex\n );\n const multi = polygonIndices.length > 2;\n\n // Polygon\n if (!multi) {\n const coordinates: Position[][] = [];\n for (let i = 0; i < primitivePolygonIndices.length - 1; i++) {\n const startRingIndex = primitivePolygonIndices[i];\n const endRingIndex = primitivePolygonIndices[i + 1];\n const ringCoordinates = ringToGeoJson(positions, startRingIndex, endRingIndex);\n coordinates.push(ringCoordinates);\n }\n\n return {type: 'Polygon', coordinates};\n }\n\n // MultiPolygon\n const coordinates: Position[][][] = [];\n for (let i = 0; i < polygonIndices.length - 1; i++) {\n const startPolygonIndex = polygonIndices[i];\n const endPolygonIndex = polygonIndices[i + 1];\n const polygonCoordinates = polygonToGeoJson(\n data,\n startPolygonIndex,\n endPolygonIndex\n ).coordinates;\n coordinates.push(polygonCoordinates as Position[][]);\n }\n\n return {type: 'MultiPolygon', coordinates};\n}\n\n/** Parse binary data of type LineString */\nfunction lineStringToGeoJson(\n data,\n startIndex: number = -Infinity,\n endIndex: number = Infinity\n): LineString | MultiLineString {\n const {positions} = data;\n const pathIndices = data.pathIndices.value.filter((x) => x >= startIndex && x <= endIndex);\n const multi = pathIndices.length > 2;\n\n if (!multi) {\n const coordinates = ringToGeoJson(positions, pathIndices[0], pathIndices[1]);\n return {type: 'LineString', coordinates};\n }\n\n const coordinates: Position[][] = [];\n for (let i = 0; i < pathIndices.length - 1; i++) {\n const ringCoordinates = ringToGeoJson(positions, pathIndices[i], pathIndices[i + 1]);\n coordinates.push(ringCoordinates);\n }\n\n return {type: 'MultiLineString', coordinates};\n}\n\n/** Parse binary data of type Point */\nfunction pointToGeoJson(data, startIndex, endIndex): Point | MultiPoint {\n const {positions} = data;\n const coordinates = ringToGeoJson(positions, startIndex, endIndex);\n const multi = coordinates.length > 1;\n\n if (multi) {\n return {type: 'MultiPoint', coordinates};\n }\n\n return {type: 'Point', coordinates: coordinates[0]};\n}\n\n/**\n * Parse a linear ring of positions to a GeoJSON linear ring\n *\n * @param positions Positions TypedArray\n * @param startIndex Start index to include in ring\n * @param endIndex End index to include in ring\n * @returns GeoJSON ring\n */\nfunction ringToGeoJson(\n positions: BinaryAttribute,\n startIndex?: number,\n endIndex?: number\n): Position[] {\n startIndex = startIndex || 0;\n endIndex = endIndex || positions.value.length / positions.size;\n\n const ringCoordinates: Position[] = [];\n for (let j = startIndex; j < endIndex; j++) {\n const coord = Array<number>();\n for (let k = j * positions.size; k < (j + 1) * positions.size; k++) {\n coord.push(Number(positions.value[k]));\n }\n ringCoordinates.push(coord);\n }\n return ringCoordinates;\n}\n\n// Deduce geometry type of data object\nfunction parseType(data) {\n if (data.pathIndices) {\n return 'LineString';\n }\n\n if (data.polygonIndices) {\n return 'Polygon';\n }\n\n return 'Point';\n}\n"],"file":"binary-to-geojson.js"}
|
|
1
|
+
{"version":3,"file":"binary-to-geojson.js","names":["binaryToGeojson","data","options","globalFeatureId","undefined","getSingleFeature","parseFeatures","type","binaryToGeoJson","format","binaryToGeometry","Error","dataArray","normalizeInput","lastIndex","lastValue","featureIds","value","i","length","currValue","globalFeatureIds","parseFeature","parseFeatureCollection","startIndex","endIndex","pointToGeoJson","lineStringToGeoJson","polygonToGeoJson","unexpectedInput","isHeterogeneousType","Boolean","points","lines","polygons","parseType","features","push","geometry","properties","parseProperties","fields","parseFields","Object","assign","key","numericProps","Infinity","positions","polygonIndices","filter","x","primitivePolygonIndices","multi","coordinates","startRingIndex","endRingIndex","ringCoordinates","ringToGeoJson","startPolygonIndex","endPolygonIndex","polygonCoordinates","pathIndices","size","j","coord","Array","k","Number"],"sources":["../../../src/lib/binary-to-geojson.ts"],"sourcesContent":["import type {\n BinaryGeometry,\n BinaryFeatures,\n BinaryGeometryType,\n BinaryPointFeatures,\n BinaryLineFeatures,\n BinaryPolygonFeatures,\n BinaryAttribute\n} from '@loaders.gl/schema';\nimport type {Feature, Geometry, Position, GeoJsonProperties} from '@loaders.gl/schema';\nimport type {\n Point,\n MultiPoint,\n LineString,\n MultiLineString,\n Polygon,\n MultiPolygon\n} from '@loaders.gl/schema';\n\n// Note:L We do not handle GeometryCollection, define a limited Geometry type that always has coordinates.\n// type FeatureGeometry = Point | MultiPoint | LineString | MultiLineString | Polygon | MultiPolygon;\n\ntype BinaryToGeoJsonOptions = {\n type?: BinaryGeometryType;\n globalFeatureId?: number;\n};\n\n/**\n * Convert binary geometry representation to GeoJSON\n * @param data geometry data in binary representation\n * @param options\n * @param options.type Input data type: Point, LineString, or Polygon\n * @param options.featureId Global feature id. If specified, only a single feature is extracted\n * @return GeoJSON objects\n */\nexport function binaryToGeojson(\n data: BinaryFeatures,\n options?: BinaryToGeoJsonOptions\n): Feature[] | Feature {\n const globalFeatureId = options?.globalFeatureId;\n if (globalFeatureId !== undefined) {\n return getSingleFeature(data, globalFeatureId);\n }\n return parseFeatures(data, options?.type);\n}\n\n/** @deprecated use `binaryToGeojson` or `binaryToGeometry` instead */\nexport function binaryToGeoJson(\n data: BinaryGeometry | BinaryFeatures,\n type?: BinaryGeometryType,\n format: 'feature' | 'geometry' = 'feature'\n): Geometry | Feature[] {\n switch (format) {\n case 'feature':\n return parseFeatures(data as BinaryFeatures, type);\n case 'geometry':\n return binaryToGeometry(data as BinaryGeometry);\n default:\n throw new Error(format);\n }\n}\n\n/**\n * Return a single feature from a binary geometry representation as GeoJSON\n * @param data geometry data in binary representation\n * @return GeoJSON feature\n */\nfunction getSingleFeature(data: BinaryFeatures, globalFeatureId: number): Feature {\n const dataArray = normalizeInput(data);\n for (const data of dataArray) {\n let lastIndex = 0;\n let lastValue = data.featureIds.value[0];\n\n // Scan through data until we find matching feature\n for (let i = 0; i < data.featureIds.value.length; i++) {\n const currValue = data.featureIds.value[i];\n if (currValue === lastValue) {\n // eslint-disable-next-line no-continue\n continue;\n }\n if (globalFeatureId === data.globalFeatureIds.value[lastIndex]) {\n return parseFeature(data, lastIndex, i);\n }\n lastIndex = i;\n lastValue = currValue;\n }\n\n if (globalFeatureId === data.globalFeatureIds.value[lastIndex]) {\n return parseFeature(data, lastIndex, data.featureIds.value.length);\n }\n }\n\n throw new Error(`featureId:${globalFeatureId} not found`);\n}\n\nfunction parseFeatures(data: BinaryFeatures, type?: BinaryGeometryType): Feature[] {\n const dataArray = normalizeInput(data, type);\n return parseFeatureCollection(dataArray);\n}\n\n/** Parse input binary data and return a valid GeoJSON geometry object */\nexport function binaryToGeometry(\n data: BinaryGeometry,\n startIndex?: number,\n endIndex?: number\n): Geometry {\n switch (data.type) {\n case 'Point':\n return pointToGeoJson(data, startIndex, endIndex);\n case 'LineString':\n return lineStringToGeoJson(data, startIndex, endIndex);\n case 'Polygon':\n return polygonToGeoJson(data, startIndex, endIndex);\n default:\n const unexpectedInput: never = data;\n throw new Error(`Unsupported geometry type: ${(unexpectedInput as any)?.type}`);\n }\n}\n\ntype BinaryFeature = BinaryPointFeatures | BinaryLineFeatures | BinaryPolygonFeatures;\ntype BinaryFeaturesArray = BinaryFeature[];\n\n// Normalize features\n// Return an array of data objects, each of which have a type key\nfunction normalizeInput(data: BinaryFeatures, type?: BinaryGeometryType): BinaryFeaturesArray {\n const isHeterogeneousType = Boolean(data.points || data.lines || data.polygons);\n\n if (!isHeterogeneousType) {\n // @ts-expect-error This is a legacy check which allowed `data` to be an instance of the values\n // here. Aka the new data.points, data.lines, or data.polygons.\n data.type = type || parseType(data);\n return [data] as BinaryFeaturesArray;\n }\n\n const features: BinaryFeaturesArray = [];\n if (data.points) {\n data.points.type = 'Point';\n features.push(data.points);\n }\n if (data.lines) {\n data.lines.type = 'LineString';\n features.push(data.lines);\n }\n if (data.polygons) {\n data.polygons.type = 'Polygon';\n features.push(data.polygons);\n }\n\n return features;\n}\n\n/** Parse input binary data and return an array of GeoJSON Features */\nfunction parseFeatureCollection(dataArray): Feature[] {\n const features: Feature[] = [];\n for (const data of dataArray) {\n if (data.featureIds.value.length === 0) {\n // eslint-disable-next-line no-continue\n continue;\n }\n let lastIndex = 0;\n let lastValue = data.featureIds.value[0];\n\n // Need to deduce start, end indices of each feature\n for (let i = 0; i < data.featureIds.value.length; i++) {\n const currValue = data.featureIds.value[i];\n if (currValue === lastValue) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n features.push(parseFeature(data, lastIndex, i));\n lastIndex = i;\n lastValue = currValue;\n }\n\n // Last feature\n features.push(parseFeature(data, lastIndex, data.featureIds.value.length));\n }\n return features;\n}\n\n/** Parse input binary data and return a single GeoJSON Feature */\nfunction parseFeature(data, startIndex?: number, endIndex?: number): Feature {\n const geometry = binaryToGeometry(data, startIndex, endIndex);\n const properties = parseProperties(data, startIndex, endIndex);\n const fields = parseFields(data, startIndex, endIndex);\n return {type: 'Feature', geometry, properties, ...fields};\n}\n\n/** Parse input binary data and return an object of fields */\nfunction parseFields(data, startIndex: number = 0, endIndex?: number): GeoJsonProperties {\n return data.fields && data.fields[data.featureIds.value[startIndex]];\n}\n\n/** Parse input binary data and return an object of properties */\nfunction parseProperties(data, startIndex: number = 0, endIndex?: number): GeoJsonProperties {\n const properties = Object.assign({}, data.properties[data.featureIds.value[startIndex]]);\n for (const key in data.numericProps) {\n properties[key] = data.numericProps[key].value[startIndex];\n }\n return properties;\n}\n\n/** Parse binary data of type Polygon */\nfunction polygonToGeoJson(\n data,\n startIndex: number = -Infinity,\n endIndex: number = Infinity\n): Polygon | MultiPolygon {\n const {positions} = data;\n const polygonIndices = data.polygonIndices.value.filter((x) => x >= startIndex && x <= endIndex);\n const primitivePolygonIndices = data.primitivePolygonIndices.value.filter(\n (x) => x >= startIndex && x <= endIndex\n );\n const multi = polygonIndices.length > 2;\n\n // Polygon\n if (!multi) {\n const coordinates: Position[][] = [];\n for (let i = 0; i < primitivePolygonIndices.length - 1; i++) {\n const startRingIndex = primitivePolygonIndices[i];\n const endRingIndex = primitivePolygonIndices[i + 1];\n const ringCoordinates = ringToGeoJson(positions, startRingIndex, endRingIndex);\n coordinates.push(ringCoordinates);\n }\n\n return {type: 'Polygon', coordinates};\n }\n\n // MultiPolygon\n const coordinates: Position[][][] = [];\n for (let i = 0; i < polygonIndices.length - 1; i++) {\n const startPolygonIndex = polygonIndices[i];\n const endPolygonIndex = polygonIndices[i + 1];\n const polygonCoordinates = polygonToGeoJson(\n data,\n startPolygonIndex,\n endPolygonIndex\n ).coordinates;\n coordinates.push(polygonCoordinates as Position[][]);\n }\n\n return {type: 'MultiPolygon', coordinates};\n}\n\n/** Parse binary data of type LineString */\nfunction lineStringToGeoJson(\n data,\n startIndex: number = -Infinity,\n endIndex: number = Infinity\n): LineString | MultiLineString {\n const {positions} = data;\n const pathIndices = data.pathIndices.value.filter((x) => x >= startIndex && x <= endIndex);\n const multi = pathIndices.length > 2;\n\n if (!multi) {\n const coordinates = ringToGeoJson(positions, pathIndices[0], pathIndices[1]);\n return {type: 'LineString', coordinates};\n }\n\n const coordinates: Position[][] = [];\n for (let i = 0; i < pathIndices.length - 1; i++) {\n const ringCoordinates = ringToGeoJson(positions, pathIndices[i], pathIndices[i + 1]);\n coordinates.push(ringCoordinates);\n }\n\n return {type: 'MultiLineString', coordinates};\n}\n\n/** Parse binary data of type Point */\nfunction pointToGeoJson(data, startIndex, endIndex): Point | MultiPoint {\n const {positions} = data;\n const coordinates = ringToGeoJson(positions, startIndex, endIndex);\n const multi = coordinates.length > 1;\n\n if (multi) {\n return {type: 'MultiPoint', coordinates};\n }\n\n return {type: 'Point', coordinates: coordinates[0]};\n}\n\n/**\n * Parse a linear ring of positions to a GeoJSON linear ring\n *\n * @param positions Positions TypedArray\n * @param startIndex Start index to include in ring\n * @param endIndex End index to include in ring\n * @returns GeoJSON ring\n */\nfunction ringToGeoJson(\n positions: BinaryAttribute,\n startIndex?: number,\n endIndex?: number\n): Position[] {\n startIndex = startIndex || 0;\n endIndex = endIndex || positions.value.length / positions.size;\n\n const ringCoordinates: Position[] = [];\n for (let j = startIndex; j < endIndex; j++) {\n const coord = Array<number>();\n for (let k = j * positions.size; k < (j + 1) * positions.size; k++) {\n coord.push(Number(positions.value[k]));\n }\n ringCoordinates.push(coord);\n }\n return ringCoordinates;\n}\n\n// Deduce geometry type of data object\nfunction parseType(data) {\n if (data.pathIndices) {\n return 'LineString';\n }\n\n if (data.polygonIndices) {\n return 'Polygon';\n }\n\n return 'Point';\n}\n"],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
|
|
1
2
|
export function extractGeometryInfo(features) {
|
|
2
3
|
let pointPositionsCount = 0;
|
|
3
4
|
let pointFeaturesCount = 0;
|
|
@@ -9,41 +10,31 @@ export function extractGeometryInfo(features) {
|
|
|
9
10
|
let polygonRingsCount = 0;
|
|
10
11
|
let polygonFeaturesCount = 0;
|
|
11
12
|
const coordLengths = new Set();
|
|
12
|
-
|
|
13
13
|
for (const feature of features) {
|
|
14
14
|
const geometry = feature.geometry;
|
|
15
|
-
|
|
16
15
|
switch (geometry.type) {
|
|
17
16
|
case 'Point':
|
|
18
17
|
pointFeaturesCount++;
|
|
19
18
|
pointPositionsCount++;
|
|
20
19
|
coordLengths.add(geometry.coordinates.length);
|
|
21
20
|
break;
|
|
22
|
-
|
|
23
21
|
case 'MultiPoint':
|
|
24
22
|
pointFeaturesCount++;
|
|
25
23
|
pointPositionsCount += geometry.coordinates.length;
|
|
26
|
-
|
|
27
24
|
for (const point of geometry.coordinates) {
|
|
28
25
|
coordLengths.add(point.length);
|
|
29
26
|
}
|
|
30
|
-
|
|
31
27
|
break;
|
|
32
|
-
|
|
33
28
|
case 'LineString':
|
|
34
29
|
lineFeaturesCount++;
|
|
35
30
|
linePositionsCount += geometry.coordinates.length;
|
|
36
31
|
linePathsCount++;
|
|
37
|
-
|
|
38
32
|
for (const coord of geometry.coordinates) {
|
|
39
33
|
coordLengths.add(coord.length);
|
|
40
34
|
}
|
|
41
|
-
|
|
42
35
|
break;
|
|
43
|
-
|
|
44
36
|
case 'MultiLineString':
|
|
45
37
|
lineFeaturesCount++;
|
|
46
|
-
|
|
47
38
|
for (const line of geometry.coordinates) {
|
|
48
39
|
linePositionsCount += line.length;
|
|
49
40
|
linePathsCount++;
|
|
@@ -52,25 +43,19 @@ export function extractGeometryInfo(features) {
|
|
|
52
43
|
coordLengths.add(coord.length);
|
|
53
44
|
}
|
|
54
45
|
}
|
|
55
|
-
|
|
56
46
|
break;
|
|
57
|
-
|
|
58
47
|
case 'Polygon':
|
|
59
48
|
polygonFeaturesCount++;
|
|
60
49
|
polygonObjectsCount++;
|
|
61
50
|
polygonRingsCount += geometry.coordinates.length;
|
|
62
51
|
const flattened = geometry.coordinates.flat();
|
|
63
52
|
polygonPositionsCount += flattened.length;
|
|
64
|
-
|
|
65
53
|
for (const coord of flattened) {
|
|
66
54
|
coordLengths.add(coord.length);
|
|
67
55
|
}
|
|
68
|
-
|
|
69
56
|
break;
|
|
70
|
-
|
|
71
57
|
case 'MultiPolygon':
|
|
72
58
|
polygonFeaturesCount++;
|
|
73
|
-
|
|
74
59
|
for (const polygon of geometry.coordinates) {
|
|
75
60
|
polygonObjectsCount++;
|
|
76
61
|
polygonRingsCount += polygon.length;
|
|
@@ -81,14 +66,11 @@ export function extractGeometryInfo(features) {
|
|
|
81
66
|
coordLengths.add(coord.length);
|
|
82
67
|
}
|
|
83
68
|
}
|
|
84
|
-
|
|
85
69
|
break;
|
|
86
|
-
|
|
87
70
|
default:
|
|
88
71
|
throw new Error("Unsupported geometry type: ".concat(geometry.type));
|
|
89
72
|
}
|
|
90
73
|
}
|
|
91
|
-
|
|
92
74
|
return {
|
|
93
75
|
coordLength: coordLengths.size > 0 ? Math.max(...coordLengths) : 2,
|
|
94
76
|
pointPositionsCount,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"extract-geometry-info.js","names":["extractGeometryInfo","features","pointPositionsCount","pointFeaturesCount","linePositionsCount","linePathsCount","lineFeaturesCount","polygonPositionsCount","polygonObjectsCount","polygonRingsCount","polygonFeaturesCount","coordLengths","Set","feature","geometry","type","add","coordinates","length","point","coord","line","flattened","flat","polygon","Error","coordLength","size","Math","max"],"sources":["../../../src/lib/extract-geometry-info.ts"],"sourcesContent":["import {Feature, GeojsonGeometryInfo} from '@loaders.gl/schema';\n\n/**\n * Initial scan over GeoJSON features\n * Counts number of coordinates of each geometry type and\n * keeps track of the max coordinate dimensions\n */\n// eslint-disable-next-line complexity, max-statements\nexport function extractGeometryInfo(features: Feature[]): GeojsonGeometryInfo {\n // Counts the number of _positions_, so [x, y, z] counts as one\n let pointPositionsCount = 0;\n let pointFeaturesCount = 0;\n let linePositionsCount = 0;\n let linePathsCount = 0;\n let lineFeaturesCount = 0;\n let polygonPositionsCount = 0;\n let polygonObjectsCount = 0;\n let polygonRingsCount = 0;\n let polygonFeaturesCount = 0;\n const coordLengths = new Set<number>();\n\n for (const feature of features) {\n const geometry = feature.geometry;\n switch (geometry.type) {\n case 'Point':\n pointFeaturesCount++;\n pointPositionsCount++;\n coordLengths.add(geometry.coordinates.length);\n break;\n case 'MultiPoint':\n pointFeaturesCount++;\n pointPositionsCount += geometry.coordinates.length;\n for (const point of geometry.coordinates) {\n coordLengths.add(point.length);\n }\n break;\n case 'LineString':\n lineFeaturesCount++;\n linePositionsCount += geometry.coordinates.length;\n linePathsCount++;\n\n for (const coord of geometry.coordinates) {\n coordLengths.add(coord.length);\n }\n break;\n case 'MultiLineString':\n lineFeaturesCount++;\n for (const line of geometry.coordinates) {\n linePositionsCount += line.length;\n linePathsCount++;\n\n // eslint-disable-next-line max-depth\n for (const coord of line) {\n coordLengths.add(coord.length);\n }\n }\n break;\n case 'Polygon':\n polygonFeaturesCount++;\n polygonObjectsCount++;\n polygonRingsCount += geometry.coordinates.length;\n const flattened = geometry.coordinates.flat();\n polygonPositionsCount += flattened.length;\n\n for (const coord of flattened) {\n coordLengths.add(coord.length);\n }\n break;\n case 'MultiPolygon':\n polygonFeaturesCount++;\n for (const polygon of geometry.coordinates) {\n polygonObjectsCount++;\n polygonRingsCount += polygon.length;\n const flattened = polygon.flat();\n polygonPositionsCount += flattened.length;\n\n // eslint-disable-next-line max-depth\n for (const coord of flattened) {\n coordLengths.add(coord.length);\n }\n }\n break;\n default:\n throw new Error(`Unsupported geometry type: ${geometry.type}`);\n }\n }\n\n return {\n coordLength: coordLengths.size > 0 ? Math.max(...coordLengths) : 2,\n\n pointPositionsCount,\n pointFeaturesCount,\n linePositionsCount,\n linePathsCount,\n lineFeaturesCount,\n polygonPositionsCount,\n polygonObjectsCount,\n polygonRingsCount,\n polygonFeaturesCount\n };\n}\n"],"mappings":"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"}
|