UNPKG

geo-toolkits

Version:

A comprehensive TypeScript library for geospatial operations including geofencing, polygon containment, area calculations, and coordinate processing. Supports GeoJSON, KML, and KMZ file formats with both local file and remote URL loading capabilities.

124 lines (123 loc) 4.59 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.DataLoader = void 0; const file_loader_1 = require("../loaders/file-loader"); const format_detector_1 = require("../loaders/format-detector"); const universal_parser_1 = require("../parsers/universal-parser"); const errors_1 = require("../utils/errors"); class DataLoader { constructor() { this.features = []; this.metadata = null; this.loaded = false; } /** * Load spatial data from URL and convert to uniform GeoJSON format */ loadFromUrl(url) { return __awaiter(this, void 0, void 0, function* () { try { console.log(`🌐 Loading spatial data from URL: ${url}`); const content = yield file_loader_1.FileLoader.load(url); yield this.processContent(content, url); } catch (error) { this.reset(); throw new errors_1.FileLoadError(`Failed to load spatial data from URL "${url}": ${error.message}`, error.code || "URL_LOAD_FAILED"); } }); } /** * Load spatial data from file and convert to uniform GeoJSON format */ loadFromFile(filePath) { return __awaiter(this, void 0, void 0, function* () { try { const content = yield file_loader_1.FileLoader.load(filePath); yield this.processContent(content, filePath); } catch (error) { this.reset(); throw new errors_1.FileLoadError(`Failed to load spatial data from file "${filePath}": ${error.message}`, error.code || "FILE_LOAD_FAILED"); } }); } /** * Get loaded spatial features */ getFeatures() { this.ensureLoaded(); return [...this.features]; // Return copy } /** * Get dataset metadata */ getMetadata() { this.ensureLoaded(); return Object.assign({}, this.metadata); } /** * Check if data is loaded */ isLoaded() { return this.loaded; } /** * Reset all data */ reset() { this.features = []; this.metadata = null; this.loaded = false; } /** * Get features by type */ getPolygons() { this.ensureLoaded(); return this.features.filter((f) => f.type === "Polygon"); } getMultiPolygons() { this.ensureLoaded(); return this.features.filter((f) => f.type === "MultiPolygon"); } // Private methods processContent(content, source) { return __awaiter(this, void 0, void 0, function* () { // Detect original format const originalFormat = format_detector_1.FormatDetector.detectFormat(source, content); // Convert everything to uniform GeoJSON format const { features, stats } = yield universal_parser_1.UniversalParser.parseToGeoJSON(content, originalFormat); if (!features || features.length === 0) { throw new errors_1.ValidationError("No valid Polygon/MultiPolygon features found", "NO_VALID_FEATURES"); } // Store normalized data this.features = features; this.metadata = { source, originalFormat, featureCount: features.length, polygonCount: stats.polygonCount, multiPolygonCount: stats.multiPolygonCount, fileSize: content.length, loadedAt: new Date().toISOString(), }; this.loaded = true; }); } ensureLoaded() { if (!this.loaded) { throw new errors_1.ValidationError("No spatial data loaded. Call loadFromUrl() or loadFromFile() first.", "NOT_LOADED"); } } } exports.DataLoader = DataLoader;