Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
"node-stream-zip": "^1.15.0",
"pino": "^8.15.0",
"pino-pretty": "^10.2.0",
"s2js": "^1.44.0",
"seedrandom": "^3.0.5",
"sharp": "^0.32.1",
"yargs": "^17.5.1"
Expand All @@ -50,9 +51,9 @@
"@microsoft/api-documenter": "^7.19.24",
"@microsoft/api-extractor": "^7.33.6",
"@types/jasmine": "^4.0.3",
"@types/yargs": "^17.0.22",
"@typescript-eslint/eslint-plugin": "^5.38.0",
"@typescript-eslint/parser": "^5.38.0",
"@types/yargs": "^17.0.22",
"c8": "^8.0.1",
"del-cli": "^5.0.0",
"eslint": "^8.23.1",
Expand Down Expand Up @@ -105,4 +106,4 @@
"package-prepare": "npm run eslint && npm run prettier-check && npm run build && npm run test && npm run coverage && npm run docs-generate && npm run generate-third-party",
"package": "npm run package-clean && npm run package-prepare && npm pack"
}
}
}
84 changes: 81 additions & 3 deletions src/cli/ToolsMain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,23 +6,24 @@ import { DeveloperError } from "../base";
import { Buffers } from "../base";
import { Iterables } from "../base";
import { ContentDataTypes } from "../base";
import { ContentDataTypeRegistry } from "../base";

import { TileFormats } from "../tilesets";
import { TileDataLayouts } from "../tilesets";
import { TileFormatError } from "../tilesets";

import { ContentOps } from "../tools";
import { TilesetJsonCreatorS2 } from "../tools";
import { TilesetSplitter } from "../tools";
import { GltfUtilities } from "../tools";

import { PipelineExecutor } from "../tools";
import { Pipelines } from "../tools";

import { TilesetOperations } from "../tools";
import { TileFormatsMigration } from "../tools";
import { TilesetConverter } from "../tools";
import { TilesetJsonCreator } from "../tools";

import { ContentDataTypeRegistry } from "../base";
import { Tileset } from "../structure";

import { Loggers } from "../base";
const logger = Loggers.get("CLI");
Expand Down Expand Up @@ -673,6 +674,83 @@ export class ToolsMain {
logger.debug(`Executing createTilesetJson DONE`);
}

static async createTilesetJsonS2(
output: string,
maximumLevelInclusive: number,
contentTemplateUri: string,
globalSplittingLevels: number[] | undefined,
force: boolean
) {
logger.debug(`Executing createTilesetJsonS2`);
logger.debug(` output: ${output}`);
logger.debug(` force: ${force}`);

ToolsMain.ensureCanWrite(output, force);

logger.info(
`Creating tileset JSON for maximum S2 level ${maximumLevelInclusive}`
);
const creator = new TilesetJsonCreatorS2();
creator.setMaxLevelInclusive(maximumLevelInclusive);
creator.setContentTemplateUri(contentTemplateUri);
const tileset = creator.createTileset();
logger.info(
`Creating tileset JSON for maximum S2 level ${maximumLevelInclusive} DONE`
);

let externalTilesets: Map<string, Tileset> = new Map<string, Tileset>();
if (globalSplittingLevels) {
logger.info(
`Splitting tileset at global levels ${globalSplittingLevels}`
);
const tilesetSplitter = new TilesetSplitter();
tilesetSplitter.setGlobalSplittingLevels(globalSplittingLevels);
externalTilesets = tilesetSplitter.splitTileset(tileset);
logger.info(
`Splitting tileset at global levels ${globalSplittingLevels} DONE`
);
}

let outputFileName = output;
let outputDirectory: string;
if (Paths.isDirectory(output)) {
outputDirectory = output;
} else {
outputDirectory = path.dirname(output);
outputFileName = path.resolve(outputDirectory, "tileset.json");
}

Paths.ensureDirectoryExists(outputDirectory);

const tilesetJsonString = JSON.stringify(tileset, null, 2);
fs.writeFileSync(outputFileName, Buffer.from(tilesetJsonString));

logger.info(`Writing tileset to ${outputFileName}`);
fs.writeFileSync(
outputFileName,
Buffer.from(JSON.stringify(tileset, null, 2))
);
logger.info(`Writing tileset to ${outputFileName} DONE`);

if (externalTilesets.size !== 0) {
logger.info(
`Writing ${externalTilesets.size} external tilesets to ${outputDirectory}`
);
for (const entry of externalTilesets.entries()) {
const name = entry[0];
const value = entry[1];
fs.writeFileSync(
path.resolve(outputDirectory, name),
Buffer.from(JSON.stringify(value, null, 2))
);
}
logger.info(
`Writing ${externalTilesets.size} external tilesets to ${outputDirectory} DONE`
);
}
logger.debug(`Executing createTilesetJsonS2 DONE`);
}

/**
* Creates a function that can resolve URIs relative to
* the given input file.
Expand Down
44 changes: 43 additions & 1 deletion src/cli/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -359,6 +359,37 @@ function parseToolArgs(a: string[]) {
},
}
)
.command(
"createTilesetJsonS2",
"Creates one or more tileset JSON files that refer to content that is identified " +
"with S2 cell tokens. ",
{
o: outputStringDefinition,
maximumLevelInclusive: {
description:
"The maximum S2 level, inclusive, for which the tilesets should be created",
type: "number",
demandOption: true,
},
contentTemplateUri: {
description:
"A string that will be used to define the content URIs for the leaf tiles " +
"of of the resulting tileset. This URI can contain a template '{cellIdToken}' " +
"that will be replaced with the actual S2 cell ID token",
type: "string",
demandOption: true,
},
globalSplittingLevels: {
description:
"An array of numbers that indicate at which global levels the tileset " +
"should be split into multiple external tilesets. If this is not given, " +
"then a single tileset JSON file will be created. Otherwise, the main " +
"tileset JSON file will refer to external tilesets (with unspecified names) " +
"that start at the respective global levels",
type: "array",
},
}
)
.demandCommand(1)
.strict();

Expand Down Expand Up @@ -503,7 +534,7 @@ async function runCommand(command: string, toolArgs: any, optionArgs: any) {
logger.trace(` optionArgs: ${optionArgs}`);
logger.trace(` parsedOptionArgs: ${JSON.stringify(parsedOptionArgs)}`);

const input = inputs[inputs.length - 1];
const input = inputs?.length > 0 ? inputs[inputs.length - 1] : "";

if (command === "b3dmToGlb") {
await ToolsMain.b3dmToGlb(input, output, force);
Expand Down Expand Up @@ -591,6 +622,17 @@ async function runCommand(command: string, toolArgs: any, optionArgs: any) {
rotationDegrees,
force
);
} else if (command === "createTilesetJsonS2") {
const maximumLevelInclusive = toolArgs.maximumLevelInclusive;
const contentTemplateUri = toolArgs.contentTemplateUri;
const globalSplittingLevels = toolArgs.globalSplittingLevels;
await ToolsMain.createTilesetJsonS2(
output,
maximumLevelInclusive,
contentTemplateUri,
globalSplittingLevels,
force
);
} else {
throw new DeveloperError(`Invalid command: ${command}`);
}
Expand Down
4 changes: 4 additions & 0 deletions src/tilesets/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,3 +65,7 @@ export * from "./traversal/TilesetTraverser";
export * from "./traversal/TilesetTraversers";
export * from "./traversal/TraversalCallback";
export * from "./traversal/TraversedTile";

export * from "./traversal/cesium/BoundingVolumeDerivation";
export * from "./traversal/cesium/HilbertOrder";
export * from "./traversal/cesium/S2Cell";
2 changes: 2 additions & 0 deletions src/tools/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ export * from "./tilesetProcessing/TilesetConverter";
export * from "./tilesetProcessing/TilesetDataProcessor";
export * from "./tilesetProcessing/TilesetEntryProcessor";
export * from "./tilesetProcessing/TilesetJsonCreator";
export * from "./tilesetProcessing/TilesetJsonCreatorS2";
export * from "./tilesetProcessing/TilesetMerger";
export * from "./tilesetProcessing/TilesetMerger3tz";
export * from "./tilesetProcessing/TilesetMergers";
Expand All @@ -70,6 +71,7 @@ export * from "./tilesetProcessing/TilesetProcessing";
export * from "./tilesetProcessing/TilesetProcessor";
export * from "./tilesetProcessing/TilesetProcessorContext";
export * from "./tilesetProcessing/TilesetProcessorContexts";
export * from "./tilesetProcessing/TilesetSplitter";
export * from "./tilesetProcessing/TilesetUpgrader";

export * from "./tilesetProcessing/upgrade/TilesetObjectUpgrader";
Expand Down
Loading
Loading