138 lines
6.4 KiB
JavaScript
138 lines
6.4 KiB
JavaScript
"use strict";
|
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
};
|
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
};
|
|
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
};
|
|
var AdminBoundariesService_1;
|
|
var _a;
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.AdminBoundariesService = void 0;
|
|
const common_1 = require("@nestjs/common");
|
|
const typeorm_1 = require("@nestjs/typeorm");
|
|
const typeorm_2 = require("typeorm");
|
|
const admin_boundary_entity_1 = require("./entities/admin-boundary.entity");
|
|
let AdminBoundariesService = AdminBoundariesService_1 = class AdminBoundariesService {
|
|
adminBoundaryRepo;
|
|
logger = new common_1.Logger(AdminBoundariesService_1.name);
|
|
constructor(adminBoundaryRepo) {
|
|
this.adminBoundaryRepo = adminBoundaryRepo;
|
|
}
|
|
async importGeoJSON(targetCountryCode, geoJson) {
|
|
this.logger.log(`Importing admin boundaries for ${targetCountryCode}...`);
|
|
let imported = 0;
|
|
let errors = 0;
|
|
let skipped = 0;
|
|
if (!geoJson || !geoJson.features || !Array.isArray(geoJson.features)) {
|
|
this.logger.error('Invalid GeoJSON format');
|
|
return { success: false, imported: 0, errors: 1, skipped: 0 };
|
|
}
|
|
for (const feature of geoJson.features) {
|
|
try {
|
|
const props = feature.properties || {};
|
|
const countryCode = props.country || props.iso_3166_1_alpha2;
|
|
if (targetCountryCode && countryCode && countryCode.toUpperCase() !== targetCountryCode.toUpperCase()) {
|
|
skipped++;
|
|
continue;
|
|
}
|
|
const subtype = (props.subtype || '').toLowerCase();
|
|
let adminLevel;
|
|
switch (subtype) {
|
|
case 'country':
|
|
adminLevel = 2;
|
|
break;
|
|
case 'region':
|
|
adminLevel = 4;
|
|
break;
|
|
case 'county':
|
|
adminLevel = 6;
|
|
break;
|
|
case 'localadmin':
|
|
adminLevel = 8;
|
|
break;
|
|
case 'locality':
|
|
adminLevel = 8;
|
|
break;
|
|
case 'neighborhood':
|
|
adminLevel = 10;
|
|
break;
|
|
case 'macrohood':
|
|
adminLevel = 9;
|
|
break;
|
|
case 'microhood':
|
|
adminLevel = 11;
|
|
break;
|
|
default:
|
|
adminLevel = parseInt(props.admin_level || props.adminLevel, 10);
|
|
}
|
|
if (isNaN(adminLevel)) {
|
|
skipped++;
|
|
continue;
|
|
}
|
|
const nameAr = props['names']?.['primary'] || props['names']?.['common'] || props['name_ar'] || props['name'];
|
|
const nameEn = props['names']?.['en'] || props['name_en'];
|
|
const isArabic = (text) => /[\u0600-\u06FF]/.test(text);
|
|
if (['JO', 'SY', 'EG'].includes(targetCountryCode.toUpperCase()) && nameAr && !isArabic(nameAr)) {
|
|
const alternativeAr = Object.values(props['names'] || {}).find(v => typeof v === 'string' && isArabic(v));
|
|
if (!alternativeAr) {
|
|
skipped++;
|
|
continue;
|
|
}
|
|
}
|
|
let geom = feature.geometry;
|
|
if (geom.type === 'Polygon') {
|
|
geom = { type: 'MultiPolygon', coordinates: [geom.coordinates] };
|
|
}
|
|
else if (geom.type !== 'MultiPolygon') {
|
|
skipped++;
|
|
continue;
|
|
}
|
|
const boundary = this.adminBoundaryRepo.create({
|
|
country_code: targetCountryCode.toUpperCase(),
|
|
admin_level: adminLevel,
|
|
name_ar: nameAr,
|
|
name_en: nameEn,
|
|
geom: geom,
|
|
});
|
|
await this.adminBoundaryRepo.save(boundary);
|
|
imported++;
|
|
}
|
|
catch (err) {
|
|
this.logger.error(`Error importing feature: ${err.message}`);
|
|
errors++;
|
|
}
|
|
}
|
|
this.logger.log(`Import finished. Imported: ${imported}, Errors: ${errors}, Skipped: ${skipped}`);
|
|
return { success: true, imported, errors, skipped };
|
|
}
|
|
async importFromFile(countryCode, filePath) {
|
|
const fs = require('fs');
|
|
if (!fs.existsSync(filePath)) {
|
|
this.logger.error(`File not found: ${filePath}`);
|
|
return { success: false, imported: 0, errors: 1, skipped: 0 };
|
|
}
|
|
try {
|
|
const data = fs.readFileSync(filePath, 'utf8');
|
|
const geoJson = JSON.parse(data);
|
|
return this.importGeoJSON(countryCode, geoJson);
|
|
}
|
|
catch (err) {
|
|
this.logger.error(`Failed to read or parse GeoJSON file: ${err.message}`);
|
|
return { success: false, imported: 0, errors: 1, skipped: 0 };
|
|
}
|
|
}
|
|
};
|
|
exports.AdminBoundariesService = AdminBoundariesService;
|
|
exports.AdminBoundariesService = AdminBoundariesService = AdminBoundariesService_1 = __decorate([
|
|
(0, common_1.Injectable)(),
|
|
__param(0, (0, typeorm_1.InjectRepository)(admin_boundary_entity_1.AdminBoundary)),
|
|
__metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _a : Object])
|
|
], AdminBoundariesService);
|
|
//# sourceMappingURL=admin-boundaries.service.js.map
|