leaflet-city-mapper 0.0.6 → 0.0.7
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/README.md +10 -5
- package/dist/leaflet-city-mapper-src.js +7059 -6566
- package/dist/leaflet-city-mapper-src.js.map +4 -4
- package/dist/leaflet-city-mapper-worker-src.js +2766 -0
- package/dist/leaflet-city-mapper-worker-src.js.map +4 -4
- package/dist/leaflet-city-mapper-worker.js +1 -1
- package/dist/leaflet-city-mapper-worker.js.map +4 -4
- package/dist/leaflet-city-mapper.js +5 -3
- package/dist/leaflet-city-mapper.js.map +4 -4
- package/libs/leaflet.js +1 -1
- package/package.json +1 -1
- package/src/camera/setBearing.js +5 -0
- package/src/camera/setPitch.js +5 -0
- package/src/cog/initCog.js +2 -2
- package/src/core/gridlayerGetTiledPixelBounds.js +37 -4
- package/src/core/markerSetPos.js +1 -1
- package/src/core/popupGetEvents.js +1 -1
- package/src/core/popupUpdatePosition.js +8 -8
- package/src/core/tooltipGetEvents.js +1 -1
- package/src/core/tooltipSetPosition.js +2 -2
- package/src/geometry/appendNativeTriangle.js +2 -2
- package/src/geometry/createModelGeometry.js +2 -9
- package/src/geometry/dashedSegment.js +10 -5
- package/src/geometry/disk.js +1 -1
- package/src/geometry/fillNativePolygon.js +20 -0
- package/src/geometry/lineJoin.js +2 -2
- package/src/geometry/markerQuadCorners.js +6 -0
- package/src/geometry/nativeGeometry.js +1 -1
- package/src/geometry/polygon.js +4 -10
- package/src/geometry/segment.js +4 -3
- package/src/globals/colorTexture.js +6 -0
- package/src/globals/depthTexture.js +1 -0
- package/src/globals/drawMeshEntry.js +1 -1
- package/src/globals/meshPipeline.js +1 -0
- package/src/globals/mvtTextDecoder.js +1 -0
- package/src/globals/nativeScalableStyleKeys.js +1 -0
- package/src/globals/scenePass.js +1 -0
- package/src/globals/vectorStyleNamedColors.js +8 -0
- package/src/globals/vectorTileEvents.js +1 -0
- package/src/globals/workerCogSource.js +1 -0
- package/src/gpu/mountRenderer.js +4 -11
- package/src/gpu/releaseRenderer.js +1 -0
- package/src/index.js +6 -12
- package/src/materials/createProgramUniforms.js +1 -0
- package/src/models/loadModel.js +6 -10
- package/src/models/loadModelResources.js +2 -8
- package/src/models/modelNode.js +3 -7
- package/src/models/prepareModel.js +19 -0
- package/src/models/prepareModelGeometry.js +25 -0
- package/src/models/prepareModelPrimitive.js +17 -0
- package/src/mvt/addMvtCrossings.js +17 -0
- package/src/mvt/appendMvtBandTriangles.js +31 -0
- package/src/mvt/appendMvtCoordinates.js +11 -0
- package/src/mvt/appendMvtPolygonTriangles.js +19 -0
- package/src/mvt/beginMvtPath.js +9 -0
- package/src/mvt/closeMvtPath.js +7 -0
- package/src/mvt/collectMvtEdges.js +19 -0
- package/src/mvt/createMvtReader.js +7 -0
- package/src/mvt/decodeVectorTile.js +32 -0
- package/src/mvt/expectMvtWire.js +3 -0
- package/src/mvt/finishMvtPath.js +5 -0
- package/src/mvt/finiteMvtCoordinate.js +7 -0
- package/src/mvt/groupMvtPolygons.js +25 -0
- package/src/mvt/isMvtFallbackError.js +6 -0
- package/src/mvt/mergeMvtActiveEdges.js +9 -0
- package/src/mvt/mvtEdgeX.js +4 -0
- package/src/mvt/mvtPathsVertices.js +8 -0
- package/src/mvt/mvtPolygonPaths.js +12 -0
- package/src/mvt/numericMvtValue.js +4 -0
- package/src/mvt/readMvtFeature.js +34 -0
- package/src/mvt/readMvtField.js +8 -0
- package/src/mvt/readMvtGeometry.js +29 -0
- package/src/mvt/readMvtInteger.js +12 -0
- package/src/mvt/readMvtKnownValue.js +21 -0
- package/src/mvt/readMvtLayer.js +31 -0
- package/src/mvt/readMvtMessage.js +10 -0
- package/src/mvt/readMvtNumber.js +9 -0
- package/src/mvt/readMvtNumbers.js +11 -0
- package/src/mvt/readMvtString.js +6 -0
- package/src/mvt/readMvtValue.js +19 -0
- package/src/mvt/skipMvtField.js +14 -0
- package/src/mvt/sortMvtActiveEdges.js +15 -0
- package/src/mvt/sortedMvtLevels.js +22 -0
- package/src/mvt/takeMvtBytes.js +8 -0
- package/src/mvt/tessellateVectorRings.js +19 -0
- package/src/mvt/triangulateVectorRings.js +19 -0
- package/src/native/beforeNativeRender.js +6 -0
- package/src/native/canScaleNativeStyle.js +17 -0
- package/src/native/createNativeMesh.js +31 -0
- package/src/native/disposeNativeLayer.js +1 -1
- package/src/native/getGridTerrainTile.js +34 -0
- package/src/native/gridTerrainElevation.js +30 -0
- package/src/native/loadGridTerrain.js +26 -0
- package/src/native/nativeLayer.js +2 -2
- package/src/native/nativeLayerMethod.js +5 -14
- package/src/native/nativeProgram.js +20 -0
- package/src/native/nativeVectorGeometry.js +23 -0
- package/src/native/orderNativeGridLayer.js +14 -0
- package/src/native/putNativeMesh.js +15 -21
- package/src/native/refreshNativeEvent.js +13 -2
- package/src/native/refreshNativeLayer.js +1 -0
- package/src/native/syncGridLayer.js +48 -3
- package/src/native/syncNativeStrokeAnchors.js +12 -0
- package/src/native/syncNativeStrokeZoom.js +29 -0
- package/src/native/syncVectorLayer.js +15 -13
- package/src/native/terrainGridMesh.js +34 -0
- package/src/native/updateNativeStrokeRadius.js +9 -0
- package/src/projections/displayContainerPoint.js +23 -3
- package/src/projections/groundBounds.js +2 -2
- package/src/projections/localPixel.js +7 -2
- package/src/projections/localPixelForGeometry.js +4 -2
- package/src/projections/projectCameraPoint.js +6 -5
- package/src/rendering/collectVisibleMesh.js +5 -2
- package/src/rendering/drawSceneMeshes.js +3 -1
- package/src/rendering/nativeStrokeExpansion.js +4 -0
- package/src/rendering/prepareMeshUniforms.js +2 -0
- package/src/rendering/resizeRenderer.js +9 -0
- package/src/scene/initializerFor.js +3 -5
- package/src/scene/layerInitialize.js +14 -12
- package/src/scene/resolveNextInitialization.js +1 -1
- package/src/shaders/materialShaders.js +1 -0
- package/src/shaders/materialVertexShader.js +7 -2
- package/src/shaders/nativeStrokeShader.js +6 -0
- package/src/sources/attachAreaMesh.js +5 -6
- package/src/sources/buildArea.js +4 -5
- package/src/sources/buildAreaFeature.js +3 -19
- package/src/sources/initVectorTiles.js +15 -0
- package/src/sources/isVectorTileSource.js +4 -0
- package/src/sources/readyVectorTiles.js +10 -0
- package/src/sources/sourceAreaContext.js +1 -6
- package/src/sunlight/createSun.js +0 -1
- package/src/terrain/initTerrain.js +7 -1
- package/src/terrain/loadTerrain.js +4 -1
- package/src/terrain/mapElevationOf.js +5 -1
- package/src/terrain/onTerrainAdd.js +11 -1
- package/src/terrain/onTerrainRemove.js +10 -1
- package/src/utils/yieldTask.js +5 -0
- package/src/vector-style/appendQuotedStyleCharacter.js +22 -0
- package/src/vector-style/arrayContainsRange.js +8 -0
- package/src/vector-style/evaluateBoolean.js +18 -0
- package/src/vector-style/evaluateCoalesceOrCase.js +21 -0
- package/src/vector-style/evaluateComparison.js +16 -0
- package/src/vector-style/evaluateIExpression.js +8 -0
- package/src/vector-style/evaluateInput.js +6 -0
- package/src/vector-style/evaluateInterpolate.js +27 -0
- package/src/vector-style/evaluateMatch.js +12 -0
- package/src/vector-style/evaluateMath.js +14 -0
- package/src/vector-style/evaluateMembership.js +18 -0
- package/src/vector-style/evaluateNegation.js +13 -0
- package/src/vector-style/evaluatePrimitive.js +9 -0
- package/src/vector-style/evaluateStep.js +11 -0
- package/src/vector-style/evaluateStyle.js +33 -0
- package/src/vector-style/evaluateToExpression.js +14 -0
- package/src/vector-style/fillVectorPaint.js +17 -0
- package/src/vector-style/lineVectorPaint.js +21 -0
- package/src/vector-style/parseFunctionalColor.js +14 -0
- package/src/vector-style/parseHexColor.js +13 -0
- package/src/vector-style/parseVectorStyle.js +13 -0
- package/src/vector-style/readPaintValue.js +6 -0
- package/src/vector-style/removeTrailingCommas.js +12 -0
- package/src/vector-style/scaleDashArray.js +13 -0
- package/src/vector-style/skipStyleComment.js +9 -0
- package/src/vector-style/stripStyleComments.js +21 -0
- package/src/vector-style/styleColor.js +11 -0
- package/src/vector-style/validateVectorLayers.js +10 -0
- package/src/vector-style/vectorPaint.js +8 -0
- package/src/vector-style/visibleStyle.js +7 -0
- package/src/vector-tiles/appendVectorBatch.js +22 -0
- package/src/vector-tiles/attachVectorTileBatch.js +17 -0
- package/src/vector-tiles/attachVectorTileBatches.js +15 -0
- package/src/vector-tiles/compareVectorLabelPriority.js +3 -0
- package/src/vector-tiles/compareVectorTileDistance.js +3 -0
- package/src/vector-tiles/configureVectorTileLayer.js +28 -0
- package/src/vector-tiles/forwardVectorTileError.js +5 -0
- package/src/vector-tiles/loadVectorSprite.js +5 -0
- package/src/vector-tiles/loadVectorTile.js +36 -0
- package/src/vector-tiles/onVectorTileAdd.js +39 -0
- package/src/vector-tiles/onVectorTileMessage.js +10 -0
- package/src/vector-tiles/onVectorTileRemove.js +20 -0
- package/src/vector-tiles/onVectorTileWorkerError.js +11 -0
- package/src/vector-tiles/paintVectorTileBatch.js +12 -0
- package/src/vector-tiles/prepareVectorLabel.js +43 -0
- package/src/vector-tiles/prepareVectorStyleLayer.js +30 -0
- package/src/vector-tiles/prepareVectorTile.js +16 -0
- package/src/vector-tiles/projectVectorPaths.js +15 -0
- package/src/vector-tiles/projectVectorPoint.js +6 -0
- package/src/vector-tiles/projectVectorTriangles.js +18 -0
- package/src/vector-tiles/pruneVectorTiles.js +11 -0
- package/src/vector-tiles/pumpVectorTiles.js +18 -0
- package/src/vector-tiles/readTileJSON.js +17 -0
- package/src/vector-tiles/readVectorStyle.js +17 -0
- package/src/vector-tiles/refreshVectorTiles.js +5 -0
- package/src/vector-tiles/reserveVectorLabelCells.js +6 -0
- package/src/vector-tiles/retireVectorTileGroup.js +13 -0
- package/src/vector-tiles/revokeVectorWorkerUrl.js +9 -0
- package/src/vector-tiles/rotateVectorLabel.js +12 -0
- package/src/vector-tiles/rotateVectorLabels.js +6 -0
- package/src/vector-tiles/simplifyVectorPath.js +21 -0
- package/src/vector-tiles/updateVectorLabelMarker.js +27 -0
- package/src/vector-tiles/updateVectorTileLabels.js +28 -0
- package/src/vector-tiles/updateVectorTilePaint.js +20 -0
- package/src/vector-tiles/updateVectorTiles.js +29 -0
- package/src/vector-tiles/validateVectorTileZooms.js +6 -0
- package/src/vector-tiles/vectorFeaturePaint.js +15 -0
- package/src/vector-tiles/vectorFeaturePaths.js +16 -0
- package/src/vector-tiles/vectorFeatureZoom.js +8 -0
- package/src/vector-tiles/vectorLabelAnchors.js +24 -0
- package/src/vector-tiles/vectorLabelCandidates.js +11 -0
- package/src/vector-tiles/vectorLabelCells.js +26 -0
- package/src/vector-tiles/vectorLabelIcon.js +30 -0
- package/src/vector-tiles/vectorLabelProperty.js +3 -0
- package/src/vector-tiles/vectorSpriteIcon.js +11 -0
- package/src/vector-tiles/vectorStraightRun.js +14 -0
- package/src/vector-tiles/vectorStyleDependencies.js +15 -0
- package/src/vector-tiles/vectorStyleValue.js +5 -0
- package/src/vector-tiles/vectorStyleZoom.js +6 -0
- package/src/vector-tiles/vectorTileAwaited.js +9 -0
- package/src/vector-tiles/vectorTileOverlaps.js +4 -0
- package/src/vector-tiles/vectorTilePaint.js +10 -0
- package/src/vector-tiles/vectorTileSettings.js +17 -0
- package/src/vector-tiles/vectorTilesIdle.js +3 -0
- package/src/vector-tiles/vectorTolerance.js +4 -0
- package/src/vector-tiles/wrapVectorLabel.js +11 -0
- package/src/weakmaps/nativeProgramsByRenderer.js +1 -0
- package/src/weakmaps/streamTerrainByLayer.js +1 -0
- package/src/weakmaps/streamTerrainByMap.js +1 -0
- package/src/weakmaps/vectorTileOptionsByLayer.js +1 -0
- package/src/weakmaps/vectorWorkerByLayer.js +1 -0
- package/src/weakmaps/workerMapByLayer.js +1 -0
- package/src/workers/buildAreaInWorker.js +3 -27
- package/src/workers/cogWorker.js +21 -0
- package/src/workers/createGeometryWorker.js +1 -0
- package/src/workers/geometryWorker.js +15 -0
- package/src/workers/getCogInWorker.js +7 -0
- package/src/workers/modelWorker.js +10 -0
- package/src/workers/openCogInWorker.js +14 -0
- package/src/workers/runSourceWorker.js +32 -0
- package/src/workers/settleGeometryWorker.js +1 -1
- package/src/workers/vectorTileWorker.js +10 -0
- package/src/geometry/buildExtrudedPolygon.js +0 -10
- package/src/sources/buildAreaPoint.js +0 -7
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { geometryEmpty } from '../globals/geometryEmpty.js';
|
|
2
|
+
import { prepareModelPrimitive } from './prepareModelPrimitive.js';
|
|
3
|
+
|
|
4
|
+
export function prepareModelGeometry(description, scene) {
|
|
5
|
+
const pending = scene.nodes.slice(), visited = /* alloc */ new Set();
|
|
6
|
+
const meshes = /* alloc */ new Set(), transfers = /* alloc */ new Set();
|
|
7
|
+
let index, spec, primitive, attribute, child;
|
|
8
|
+
while (pending.length) {
|
|
9
|
+
index = pending.pop();
|
|
10
|
+
if (visited.has(index)) continue;
|
|
11
|
+
visited.add(index);
|
|
12
|
+
spec = description.nodes[index];
|
|
13
|
+
if (!spec) throw /* alloc */ new Error('Invalid glTF node');
|
|
14
|
+
if (spec.mesh !== undefined) meshes.add(spec.mesh);
|
|
15
|
+
for (child of spec.children || geometryEmpty) pending.push(child);
|
|
16
|
+
}
|
|
17
|
+
for (index of meshes) {
|
|
18
|
+
for (primitive of description.meshes[index].primitives) {
|
|
19
|
+
for (attribute of Object.values(prepareModelPrimitive(description, primitive))) {
|
|
20
|
+
transfers.add(attribute.data.buffer);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return /* alloc */ [...transfers];
|
|
25
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { readModelAttributes } from './readModelAttributes.js';
|
|
2
|
+
import { readModelIndices } from './readModelIndices.js';
|
|
3
|
+
import { vertexNormals } from '../geometry/vertexNormals.js';
|
|
4
|
+
|
|
5
|
+
export function prepareModelPrimitive(description, primitive) {
|
|
6
|
+
const { attributes, vertexCount } = readModelAttributes(description, primitive);
|
|
7
|
+
readModelIndices(description, primitive, attributes, vertexCount);
|
|
8
|
+
if (!attributes.normal) {
|
|
9
|
+
attributes.normal = /* alloc */ { size: 3,
|
|
10
|
+
data: vertexNormals(attributes.position.data, attributes.index?.data) };
|
|
11
|
+
}
|
|
12
|
+
if (attributes.index?.data instanceof Uint8Array) {
|
|
13
|
+
attributes.index.data = Uint16Array.from(attributes.index.data);
|
|
14
|
+
}
|
|
15
|
+
primitive.preparedAttributes = attributes;
|
|
16
|
+
return attributes;
|
|
17
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { mvtEdgeX } from './mvtEdgeX.js';
|
|
2
|
+
|
|
3
|
+
export function addMvtCrossings(edges, levels) {
|
|
4
|
+
let i = 0, j, a, b, top, bottom, start, end;
|
|
5
|
+
for (; i < edges.length; i++) {
|
|
6
|
+
a = edges[i];
|
|
7
|
+
for (j = i + 1; j < edges.length; j++) {
|
|
8
|
+
b = edges[j];
|
|
9
|
+
top = Math.max(a[0][1], b[0][1]);
|
|
10
|
+
bottom = Math.min(a[1][1], b[1][1]);
|
|
11
|
+
if (top >= bottom) continue;
|
|
12
|
+
start = mvtEdgeX(a, top) - mvtEdgeX(b, top);
|
|
13
|
+
end = mvtEdgeX(a, bottom) - mvtEdgeX(b, bottom);
|
|
14
|
+
if (start * end < 0) levels.add(top + (bottom - top) * start / (start - end));
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { mvtEdgeX } from './mvtEdgeX.js';
|
|
2
|
+
import { sortMvtActiveEdges } from './sortMvtActiveEdges.js';
|
|
3
|
+
|
|
4
|
+
export function appendMvtBandTriangles(edges, top, bottom, triangles) {
|
|
5
|
+
const mid = (top + bottom) / 2, active = /* alloc */ [];
|
|
6
|
+
let edge, i = 0, leftTop, leftBottom, rightTop, rightBottom;
|
|
7
|
+
for (edge of edges) {
|
|
8
|
+
if (edge[0][1] < mid && edge[1][1] > mid) {
|
|
9
|
+
active.push(/* alloc */ { edge, x: mvtEdgeX(edge, mid) });
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
sortMvtActiveEdges(active);
|
|
13
|
+
if (active.length % 2) throw /* alloc */ new Error('Unbalanced MVT polygon edges');
|
|
14
|
+
for (; i < active.length; i += 2) {
|
|
15
|
+
leftTop = mvtEdgeX(active[i].edge, top);
|
|
16
|
+
leftBottom = mvtEdgeX(active[i].edge, bottom);
|
|
17
|
+
rightTop = mvtEdgeX(active[i + 1].edge, top);
|
|
18
|
+
rightBottom = mvtEdgeX(active[i + 1].edge, bottom);
|
|
19
|
+
if (rightTop < leftTop - 1e-8 || rightBottom < leftBottom - 1e-8) {
|
|
20
|
+
throw /* alloc */ new Error('Crossing MVT polygon edges');
|
|
21
|
+
}
|
|
22
|
+
if ((rightTop - leftTop) * (bottom - top) > 1e-6) {
|
|
23
|
+
triangles.push(/* alloc */ [/* alloc */ [leftTop, top], /* alloc */ [rightTop, top],
|
|
24
|
+
/* alloc */ [leftBottom, bottom]]);
|
|
25
|
+
}
|
|
26
|
+
if ((rightBottom - leftBottom) * (bottom - top) > 1e-6) {
|
|
27
|
+
triangles.push(/* alloc */ [/* alloc */ [rightTop, top], /* alloc */ [rightBottom, bottom],
|
|
28
|
+
/* alloc */ [leftBottom, bottom]]);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export function appendMvtCoordinates(commands, state, count) {
|
|
2
|
+
let i = 0, dx, dy;
|
|
3
|
+
for (; i < count; i++) {
|
|
4
|
+
dx = commands[state.index++];
|
|
5
|
+
dy = commands[state.index++];
|
|
6
|
+
if (dx > 0xffffffff || dy > 0xffffffff) throw /* alloc */ new Error('Invalid MVT coordinate');
|
|
7
|
+
state.x += dx % 2 ? -(dx + 1) / 2 : dx / 2;
|
|
8
|
+
state.y += dy % 2 ? -(dy + 1) / 2 : dy / 2;
|
|
9
|
+
state.path.push(/* alloc */ [state.x, state.y]);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { tessellateVectorRings } from './tessellateVectorRings.js';
|
|
2
|
+
import { triangulate } from '../triangulation/triangulate.js';
|
|
3
|
+
import { isMvtFallbackError } from './isMvtFallbackError.js';
|
|
4
|
+
|
|
5
|
+
export function appendMvtPolygonTriangles(rings, paths, vertices, triangles) {
|
|
6
|
+
let indices, index, triangle, points, i = 0;
|
|
7
|
+
try {
|
|
8
|
+
indices = triangulate(paths[0], paths.slice(1));
|
|
9
|
+
for (triangle of indices) {
|
|
10
|
+
points = /* alloc */ [];
|
|
11
|
+
for (index of triangle) points.push(/* alloc */ [vertices[index].x, vertices[index].y]);
|
|
12
|
+
triangles.push(points);
|
|
13
|
+
}
|
|
14
|
+
} catch (error) {
|
|
15
|
+
if (!isMvtFallbackError(error)) throw error;
|
|
16
|
+
indices = tessellateVectorRings(rings);
|
|
17
|
+
for (; i < indices.length; i++) triangles.push(indices[i]);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { finishMvtPath } from './finishMvtPath.js';
|
|
2
|
+
|
|
3
|
+
export function beginMvtPath(state, paths, type, count) {
|
|
4
|
+
finishMvtPath(state.path, type, state.closed);
|
|
5
|
+
if (type !== 1 && count !== 1) throw /* alloc */ new Error('Invalid MVT MoveTo');
|
|
6
|
+
state.path = /* alloc */ [];
|
|
7
|
+
paths.push(state.path);
|
|
8
|
+
state.closed = false;
|
|
9
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export function closeMvtPath(state, type, count) {
|
|
2
|
+
if (type !== 3 || count !== 1 || !state.path || state.closed || state.path.length < 3) {
|
|
3
|
+
throw /* alloc */ new Error('Invalid MVT ClosePath');
|
|
4
|
+
}
|
|
5
|
+
state.path.push(/* alloc */ [...state.path[0]]);
|
|
6
|
+
state.closed = true;
|
|
7
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { finiteMvtCoordinate } from './finiteMvtCoordinate.js';
|
|
2
|
+
|
|
3
|
+
export function collectMvtEdges(rings, edges, levels) {
|
|
4
|
+
let ring, i, a, b;
|
|
5
|
+
for (ring of rings) {
|
|
6
|
+
if (ring.length < 4 || ring[0][0] !== ring.at(-1)[0] || ring[0][1] !== ring.at(-1)[1]) {
|
|
7
|
+
throw /* alloc */ new Error('MVT tessellation requires closed rings');
|
|
8
|
+
}
|
|
9
|
+
for (i = 1; i < ring.length; i++) {
|
|
10
|
+
a = ring[i - 1];
|
|
11
|
+
b = ring[i];
|
|
12
|
+
if (!finiteMvtCoordinate(a) || !finiteMvtCoordinate(b)) {
|
|
13
|
+
throw /* alloc */ new Error('Invalid MVT ring coordinate');
|
|
14
|
+
}
|
|
15
|
+
levels.add(a[1]);
|
|
16
|
+
if (a[1] !== b[1]) edges.push(/* alloc */ [a[1] < b[1] ? a : b, a[1] < b[1] ? b : a]);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { createMvtReader } from './createMvtReader.js';
|
|
2
|
+
import { readMvtField } from './readMvtField.js';
|
|
3
|
+
import { readMvtLayer } from './readMvtLayer.js';
|
|
4
|
+
import { readMvtMessage } from './readMvtMessage.js';
|
|
5
|
+
import { skipMvtField } from './skipMvtField.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Decode an uncompressed MVT ArrayBuffer/Uint8Array into tile-local layers.
|
|
9
|
+
* Feature types: 0 unknown, 1 points, 2 lines, 3 polygon rings (including holes).
|
|
10
|
+
* Integers outside JavaScript's safe range are returned as decimal strings.
|
|
11
|
+
*/
|
|
12
|
+
export function decodeVectorTile(buffer) {
|
|
13
|
+
if (!(buffer instanceof ArrayBuffer) && !(buffer instanceof Uint8Array)) {
|
|
14
|
+
throw /* alloc */ new TypeError('MVT input must be an ArrayBuffer or Uint8Array');
|
|
15
|
+
}
|
|
16
|
+
const bytes = buffer instanceof Uint8Array ? buffer : /* alloc */ new Uint8Array(buffer);
|
|
17
|
+
const reader = createMvtReader(bytes);
|
|
18
|
+
const layers = /* alloc */ [], names = /* alloc */ new Set();
|
|
19
|
+
let field, wire, layer;
|
|
20
|
+
while (reader.pos < reader.bytes.length) {
|
|
21
|
+
[field, wire] = readMvtField(reader);
|
|
22
|
+
if (field !== 3) {
|
|
23
|
+
skipMvtField(reader, wire);
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
layer = readMvtLayer(readMvtMessage(reader, wire));
|
|
27
|
+
if (names.has(layer.name)) throw /* alloc */ new Error('Duplicate MVT layer name');
|
|
28
|
+
names.add(layer.name);
|
|
29
|
+
layers.push(layer);
|
|
30
|
+
}
|
|
31
|
+
return layers;
|
|
32
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { finiteMvtCoordinate } from './finiteMvtCoordinate.js';
|
|
2
|
+
|
|
3
|
+
export function groupMvtPolygons(rings) {
|
|
4
|
+
const polygons = /* alloc */ [];
|
|
5
|
+
let polygon, exteriorSign, ring, area, i;
|
|
6
|
+
for (ring of rings) {
|
|
7
|
+
if (ring.length < 4 || ring[0][0] !== ring.at(-1)[0] || ring[0][1] !== ring.at(-1)[1]) {
|
|
8
|
+
throw /* alloc */ new Error('MVT tessellation requires closed rings');
|
|
9
|
+
}
|
|
10
|
+
area = 0;
|
|
11
|
+
for (i = 1; i < ring.length; i++) {
|
|
12
|
+
if (!finiteMvtCoordinate(ring[i]) || !finiteMvtCoordinate(ring[i - 1])) {
|
|
13
|
+
throw /* alloc */ new Error('Invalid MVT ring coordinate');
|
|
14
|
+
}
|
|
15
|
+
area += ring[i - 1][0] * ring[i][1] - ring[i][0] * ring[i - 1][1];
|
|
16
|
+
}
|
|
17
|
+
if (!polygon || area && Math.sign(area) === exteriorSign) {
|
|
18
|
+
polygon = /* alloc */ [];
|
|
19
|
+
polygons.push(polygon);
|
|
20
|
+
exteriorSign = Math.sign(area);
|
|
21
|
+
}
|
|
22
|
+
polygon.push(ring);
|
|
23
|
+
}
|
|
24
|
+
return polygons;
|
|
25
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export function isMvtFallbackError(error) {
|
|
2
|
+
return error.message === 'Polygon triangulation area mismatch' ||
|
|
3
|
+
error.message === 'Degenerate polygon ring' ||
|
|
4
|
+
error.message === 'Unable to triangulate polygon: invalid or self-intersecting rings' ||
|
|
5
|
+
error.message === 'Unable to connect polygon hole';
|
|
6
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export function mergeMvtActiveEdges(active, sorted, left, mid, right) {
|
|
2
|
+
let i = left, j = mid, k = left;
|
|
3
|
+
while (i < mid && j < right) {
|
|
4
|
+
if (active[j].x < active[i].x) sorted[k++] = active[j++];
|
|
5
|
+
else sorted[k++] = active[i++];
|
|
6
|
+
}
|
|
7
|
+
while (i < mid) sorted[k++] = active[i++];
|
|
8
|
+
while (j < right) sorted[k++] = active[j++];
|
|
9
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function mvtPolygonPaths(rings) {
|
|
2
|
+
const paths = /* alloc */ [];
|
|
3
|
+
let ring, i, path;
|
|
4
|
+
for (ring of rings) {
|
|
5
|
+
path = /* alloc */ [];
|
|
6
|
+
for (i = 0; i < ring.length - 1; i++) {
|
|
7
|
+
path.push(/* alloc */ { x: ring[i][0], y: ring[i][1] });
|
|
8
|
+
}
|
|
9
|
+
paths.push(path);
|
|
10
|
+
}
|
|
11
|
+
return paths;
|
|
12
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { expectMvtWire } from './expectMvtWire.js';
|
|
2
|
+
import { numericMvtValue } from './numericMvtValue.js';
|
|
3
|
+
import { readMvtField } from './readMvtField.js';
|
|
4
|
+
import { readMvtGeometry } from './readMvtGeometry.js';
|
|
5
|
+
import { readMvtInteger } from './readMvtInteger.js';
|
|
6
|
+
import { readMvtNumber } from './readMvtNumber.js';
|
|
7
|
+
import { readMvtNumbers } from './readMvtNumbers.js';
|
|
8
|
+
import { skipMvtField } from './skipMvtField.js';
|
|
9
|
+
|
|
10
|
+
export function readMvtFeature(reader, keys, values) {
|
|
11
|
+
let id, type = 0, field, wire, i = 0;
|
|
12
|
+
const tags = /* alloc */ [], commands = /* alloc */ [];
|
|
13
|
+
while (reader.pos < reader.bytes.length) {
|
|
14
|
+
[field, wire] = readMvtField(reader);
|
|
15
|
+
if (field === 1) {
|
|
16
|
+
expectMvtWire(wire, 0);
|
|
17
|
+
id = numericMvtValue(readMvtInteger(reader));
|
|
18
|
+
} else if (field === 2) readMvtNumbers(reader, wire, tags);
|
|
19
|
+
else if (field === 3) {
|
|
20
|
+
expectMvtWire(wire, 0);
|
|
21
|
+
type = readMvtNumber(reader);
|
|
22
|
+
} else if (field === 4) readMvtNumbers(reader, wire, commands);
|
|
23
|
+
else skipMvtField(reader, wire);
|
|
24
|
+
}
|
|
25
|
+
if (tags.length % 2 || type > 3) throw /* alloc */ new Error('Invalid MVT feature');
|
|
26
|
+
const properties = Object.create(null);
|
|
27
|
+
for (; i < tags.length; i += 2) {
|
|
28
|
+
if (tags[i] >= keys.length || tags[i + 1] >= values.length) {
|
|
29
|
+
throw /* alloc */ new Error('Invalid MVT property index');
|
|
30
|
+
}
|
|
31
|
+
properties[keys[tags[i]]] = values[tags[i + 1]];
|
|
32
|
+
}
|
|
33
|
+
return /* alloc */ { id, type, properties, geometry: type ? readMvtGeometry(commands, type) : /* alloc */ [] };
|
|
34
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { readMvtNumber } from './readMvtNumber.js';
|
|
2
|
+
|
|
3
|
+
export function readMvtField(reader) {
|
|
4
|
+
const tag = readMvtNumber(reader);
|
|
5
|
+
const field = Math.floor(tag / 8), wire = tag % 8;
|
|
6
|
+
if (!field || field > 536870911) throw /* alloc */ new Error('Invalid MVT field number');
|
|
7
|
+
return /* alloc */ [field, wire];
|
|
8
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { finishMvtPath } from './finishMvtPath.js';
|
|
2
|
+
import { appendMvtCoordinates } from './appendMvtCoordinates.js';
|
|
3
|
+
import { beginMvtPath } from './beginMvtPath.js';
|
|
4
|
+
import { closeMvtPath } from './closeMvtPath.js';
|
|
5
|
+
|
|
6
|
+
export function readMvtGeometry(commands, type) {
|
|
7
|
+
const paths = /* alloc */ [];
|
|
8
|
+
const state = /* alloc */ { x: 0, y: 0, path: null, closed: false, index: 0 };
|
|
9
|
+
let command, id, count;
|
|
10
|
+
while (state.index < commands.length) {
|
|
11
|
+
command = commands[state.index++];
|
|
12
|
+
id = command % 8;
|
|
13
|
+
count = Math.floor(command / 8);
|
|
14
|
+
if (!count || command > 0xffffffff) throw /* alloc */ new Error('Invalid MVT geometry command');
|
|
15
|
+
if (id === 7) {
|
|
16
|
+
closeMvtPath(state, type, count);
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
if (id !== 1 && id !== 2 || count > Math.floor((commands.length - state.index) / 2)) {
|
|
20
|
+
throw /* alloc */ new Error('Invalid MVT geometry parameters');
|
|
21
|
+
}
|
|
22
|
+
if (id === 1) beginMvtPath(state, paths, type, count);
|
|
23
|
+
else if (type === 1 || !state.path || state.closed) throw /* alloc */ new Error('Invalid MVT LineTo');
|
|
24
|
+
appendMvtCoordinates(commands, state, count);
|
|
25
|
+
}
|
|
26
|
+
finishMvtPath(state.path, type, state.closed);
|
|
27
|
+
if (!paths.length) throw /* alloc */ new Error('Empty MVT geometry');
|
|
28
|
+
return paths;
|
|
29
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { takeMvtBytes } from './takeMvtBytes.js';
|
|
2
|
+
|
|
3
|
+
export function readMvtInteger(reader) {
|
|
4
|
+
let value = 0n, i = 0, byte;
|
|
5
|
+
for (; i < 10; i++) {
|
|
6
|
+
byte = reader.bytes[takeMvtBytes(reader, 1)];
|
|
7
|
+
if (i === 9 && byte > 1) throw /* alloc */ new Error('Invalid MVT varint');
|
|
8
|
+
value |= BigInt(byte & 127) << BigInt(i * 7);
|
|
9
|
+
if (byte < 128) return value;
|
|
10
|
+
}
|
|
11
|
+
throw /* alloc */ new Error('Invalid MVT varint');
|
|
12
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { expectMvtWire } from './expectMvtWire.js';
|
|
2
|
+
import { numericMvtValue } from './numericMvtValue.js';
|
|
3
|
+
import { readMvtInteger } from './readMvtInteger.js';
|
|
4
|
+
import { readMvtString } from './readMvtString.js';
|
|
5
|
+
import { takeMvtBytes } from './takeMvtBytes.js';
|
|
6
|
+
|
|
7
|
+
export function readMvtKnownValue(reader, field, wire) {
|
|
8
|
+
let offset, integer;
|
|
9
|
+
if (field === 1) return readMvtString(reader, wire);
|
|
10
|
+
if (field === 2 || field === 3) {
|
|
11
|
+
expectMvtWire(wire, field === 2 ? 5 : 1);
|
|
12
|
+
offset = takeMvtBytes(reader, field === 2 ? 4 : 8);
|
|
13
|
+
return field === 2 ? reader.view.getFloat32(offset, true) : reader.view.getFloat64(offset, true);
|
|
14
|
+
}
|
|
15
|
+
expectMvtWire(wire, 0);
|
|
16
|
+
integer = readMvtInteger(reader);
|
|
17
|
+
if (field === 4) return numericMvtValue(BigInt.asIntN(64, integer));
|
|
18
|
+
if (field === 5) return numericMvtValue(integer);
|
|
19
|
+
if (field === 6) return numericMvtValue((integer >> 1n) ^ -(integer & 1n));
|
|
20
|
+
return integer !== 0n;
|
|
21
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { expectMvtWire } from './expectMvtWire.js';
|
|
2
|
+
import { readMvtFeature } from './readMvtFeature.js';
|
|
3
|
+
import { readMvtField } from './readMvtField.js';
|
|
4
|
+
import { readMvtMessage } from './readMvtMessage.js';
|
|
5
|
+
import { readMvtNumber } from './readMvtNumber.js';
|
|
6
|
+
import { readMvtString } from './readMvtString.js';
|
|
7
|
+
import { readMvtValue } from './readMvtValue.js';
|
|
8
|
+
import { skipMvtField } from './skipMvtField.js';
|
|
9
|
+
|
|
10
|
+
export function readMvtLayer(reader) {
|
|
11
|
+
let name, version, extent = 4096, field, wire, value, i = 0;
|
|
12
|
+
const keys = /* alloc */ [], values = /* alloc */ [], features = /* alloc */ [];
|
|
13
|
+
while (reader.pos < reader.bytes.length) {
|
|
14
|
+
[field, wire] = readMvtField(reader);
|
|
15
|
+
if (field === 1) name = readMvtString(reader, wire);
|
|
16
|
+
else if (field === 2) features.push(readMvtMessage(reader, wire));
|
|
17
|
+
else if (field === 3) keys.push(readMvtString(reader, wire));
|
|
18
|
+
else if (field === 4) values.push(readMvtValue(readMvtMessage(reader, wire)));
|
|
19
|
+
else if (field === 5 || field === 15) {
|
|
20
|
+
expectMvtWire(wire, 0);
|
|
21
|
+
value = readMvtNumber(reader);
|
|
22
|
+
if (field === 5) extent = value;
|
|
23
|
+
else version = value;
|
|
24
|
+
} else skipMvtField(reader, wire);
|
|
25
|
+
}
|
|
26
|
+
if (!name || !/* alloc */ [1, 2].includes(version) || !extent || extent > 0xffffffff) {
|
|
27
|
+
throw /* alloc */ new Error('Invalid MVT layer metadata');
|
|
28
|
+
}
|
|
29
|
+
for (; i < features.length; i++) features[i] = readMvtFeature(features[i], keys, values);
|
|
30
|
+
return /* alloc */ { name, extent, features };
|
|
31
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { createMvtReader } from './createMvtReader.js';
|
|
2
|
+
import { expectMvtWire } from './expectMvtWire.js';
|
|
3
|
+
import { readMvtNumber } from './readMvtNumber.js';
|
|
4
|
+
import { takeMvtBytes } from './takeMvtBytes.js';
|
|
5
|
+
|
|
6
|
+
export function readMvtMessage(reader, wire) {
|
|
7
|
+
expectMvtWire(wire, 2);
|
|
8
|
+
const size = readMvtNumber(reader), start = takeMvtBytes(reader, size);
|
|
9
|
+
return createMvtReader(reader.bytes.subarray(start, start + size));
|
|
10
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { readMvtInteger } from './readMvtInteger.js';
|
|
2
|
+
|
|
3
|
+
export function readMvtNumber(reader) {
|
|
4
|
+
const value = readMvtInteger(reader);
|
|
5
|
+
if (value > BigInt(Number.MAX_SAFE_INTEGER)) {
|
|
6
|
+
throw /* alloc */ new Error('MVT integer exceeds safe range');
|
|
7
|
+
}
|
|
8
|
+
return Number(value);
|
|
9
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { readMvtMessage } from './readMvtMessage.js';
|
|
2
|
+
import { readMvtNumber } from './readMvtNumber.js';
|
|
3
|
+
|
|
4
|
+
export function readMvtNumbers(reader, wire, target) {
|
|
5
|
+
let packed;
|
|
6
|
+
if (wire === 0) target.push(readMvtNumber(reader));
|
|
7
|
+
else {
|
|
8
|
+
packed = readMvtMessage(reader, wire);
|
|
9
|
+
while (packed.pos < packed.bytes.length) target.push(readMvtNumber(packed));
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { readMvtField } from './readMvtField.js';
|
|
2
|
+
import { skipMvtField } from './skipMvtField.js';
|
|
3
|
+
import { readMvtKnownValue } from './readMvtKnownValue.js';
|
|
4
|
+
|
|
5
|
+
export function readMvtValue(reader) {
|
|
6
|
+
let value, found = false, field, wire;
|
|
7
|
+
while (reader.pos < reader.bytes.length) {
|
|
8
|
+
[field, wire] = readMvtField(reader);
|
|
9
|
+
if (field < 1 || field > 7) {
|
|
10
|
+
skipMvtField(reader, wire);
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
if (found) throw /* alloc */ new Error('Multiple MVT value types');
|
|
14
|
+
found = true;
|
|
15
|
+
value = readMvtKnownValue(reader, field, wire);
|
|
16
|
+
}
|
|
17
|
+
if (!found) throw /* alloc */ new Error('Empty MVT value');
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { expectMvtWire } from './expectMvtWire.js';
|
|
2
|
+
import { readMvtInteger } from './readMvtInteger.js';
|
|
3
|
+
import { readMvtNumber } from './readMvtNumber.js';
|
|
4
|
+
import { takeMvtBytes } from './takeMvtBytes.js';
|
|
5
|
+
|
|
6
|
+
export function skipMvtField(reader, wire) {
|
|
7
|
+
switch (wire) {
|
|
8
|
+
case 0: readMvtInteger(reader); break;
|
|
9
|
+
case 1: takeMvtBytes(reader, 8); break;
|
|
10
|
+
case 2: takeMvtBytes(reader, readMvtNumber(reader)); break;
|
|
11
|
+
case 5: takeMvtBytes(reader, 4); break;
|
|
12
|
+
default: throw /* alloc */ new Error('Unsupported MVT wire type');
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { mergeMvtActiveEdges } from './mergeMvtActiveEdges.js';
|
|
2
|
+
|
|
3
|
+
export function sortMvtActiveEdges(active) {
|
|
4
|
+
const sorted = /* alloc */ new Array(active.length);
|
|
5
|
+
let width = 1, left, mid, right, i;
|
|
6
|
+
while (width < active.length) {
|
|
7
|
+
for (left = 0; left < active.length; left += width * 2) {
|
|
8
|
+
mid = Math.min(left + width, active.length);
|
|
9
|
+
right = Math.min(left + width * 2, active.length);
|
|
10
|
+
mergeMvtActiveEdges(active, sorted, left, mid, right);
|
|
11
|
+
}
|
|
12
|
+
for (i = 0; i < active.length; i++) active[i] = sorted[i];
|
|
13
|
+
width *= 2;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export function sortedMvtLevels(levels) {
|
|
2
|
+
const sorted = /* alloc */ [];
|
|
3
|
+
let y, gap = 0, i = 0, j, value, count = 0;
|
|
4
|
+
for (y of levels) sorted.push(y);
|
|
5
|
+
gap = Math.floor(sorted.length / 2);
|
|
6
|
+
for (; gap > 0; gap = Math.floor(gap / 2)) {
|
|
7
|
+
for (i = gap; i < sorted.length; i++) {
|
|
8
|
+
value = sorted[i];
|
|
9
|
+
j = i;
|
|
10
|
+
while (j >= gap && sorted[j - gap] > value) {
|
|
11
|
+
sorted[j] = sorted[j - gap];
|
|
12
|
+
j -= gap;
|
|
13
|
+
}
|
|
14
|
+
sorted[j] = value;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
for (i = 0; i < sorted.length; i++) {
|
|
18
|
+
if (!count || sorted[i] - sorted[count - 1] > 1e-8) sorted[count++] = sorted[i];
|
|
19
|
+
}
|
|
20
|
+
sorted.length = count;
|
|
21
|
+
return sorted;
|
|
22
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { addMvtCrossings } from './addMvtCrossings.js';
|
|
2
|
+
import { appendMvtBandTriangles } from './appendMvtBandTriangles.js';
|
|
3
|
+
import { collectMvtEdges } from './collectMvtEdges.js';
|
|
4
|
+
import { sortedMvtLevels } from './sortedMvtLevels.js';
|
|
5
|
+
|
|
6
|
+
export function tessellateVectorRings(rings) {
|
|
7
|
+
const edges = /* alloc */ [], levels = /* alloc */ new Set(), triangles = /* alloc */ [];
|
|
8
|
+
let sorted, i = 1, top, bottom;
|
|
9
|
+
collectMvtEdges(rings, edges, levels);
|
|
10
|
+
addMvtCrossings(edges, levels);
|
|
11
|
+
sorted = sortedMvtLevels(levels);
|
|
12
|
+
// ponytail: quadratic edge scan; use a sweep-line index for large datasets.
|
|
13
|
+
for (; i < sorted.length; i++) {
|
|
14
|
+
top = sorted[i - 1];
|
|
15
|
+
bottom = sorted[i];
|
|
16
|
+
if (bottom > top) appendMvtBandTriangles(edges, top, bottom, triangles);
|
|
17
|
+
}
|
|
18
|
+
return triangles;
|
|
19
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { appendMvtPolygonTriangles } from './appendMvtPolygonTriangles.js';
|
|
2
|
+
import { groupMvtPolygons } from './groupMvtPolygons.js';
|
|
3
|
+
import { mvtPathsVertices } from './mvtPathsVertices.js';
|
|
4
|
+
import { mvtPolygonPaths } from './mvtPolygonPaths.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Reuse City Mapper's triangulator in tile space, with even-odd tessellation
|
|
8
|
+
* for quantized touching/crossing rings. Output triangles omit their closure.
|
|
9
|
+
*/
|
|
10
|
+
export function triangulateVectorRings(rings) {
|
|
11
|
+
const polygons = groupMvtPolygons(rings), triangles = /* alloc */ [];
|
|
12
|
+
let polygon, paths, vertices;
|
|
13
|
+
for (polygon of polygons) {
|
|
14
|
+
paths = mvtPolygonPaths(polygon);
|
|
15
|
+
vertices = mvtPathsVertices(paths);
|
|
16
|
+
appendMvtPolygonTriangles(polygon, paths, vertices, triangles);
|
|
17
|
+
}
|
|
18
|
+
return triangles;
|
|
19
|
+
}
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
import { synchronizeNativeLayer } from './synchronizeNativeLayer.js';
|
|
2
|
+
import { cameraViewByMap } from '../weakmaps/cameraViewByMap.js';
|
|
2
3
|
|
|
3
4
|
export function beforeNativeRender(state) {
|
|
4
5
|
try {
|
|
5
6
|
synchronizeNativeLayer(state);
|
|
7
|
+
const uniform = state.meshes.get('stroke')?.program.uniforms.strokeScale;
|
|
8
|
+
if (uniform) {
|
|
9
|
+
const zoom = cameraViewByMap.get(state.map)?.zoom ?? state.map.getZoom();
|
|
10
|
+
uniform.value = 2 ** (state.strokeZoom - zoom) * Number(state.source.options.weight) / state.strokeWeight;
|
|
11
|
+
}
|
|
6
12
|
} catch (error) {
|
|
7
13
|
state.failed = true;
|
|
8
14
|
state.source.fire('error', /* alloc */ { error });
|