feat(tactical): sovereign military suite with 100% real satellite DEM intervisibility, viewshed 360, offline engines, and entitlements

This commit is contained in:
Hamza-Ayed
2026-08-22 15:11:16 +03:00
parent 4a7859f4c2
commit c10fd2396c
74 changed files with 14866 additions and 4001 deletions
+21 -5
View File
@@ -10,6 +10,7 @@ import { PlaceIraq } from './entities/place-iraq.entity';
import { BasePlace } from './entities/base-place.entity';
import { OsmArea } from './entities/osm-area.entity';
import { OsmPointWithArea } from './entities/osm-point-with-area.entity';
import { getElevationMeters } from '../common/gis.utils';
@Injectable()
export class GeocodingService {
@@ -247,14 +248,21 @@ export class GeocodingService {
const full_address = addressParts.length > 0 ? addressParts.join('، ') : (r.address || '');
const nameAr = r.name_ar || r.name;
const displayName = relativePrefix ? `${relativePrefix} ${nameAr}` : nameAr;
const lat = parseFloat(r.latitude);
const lng = parseFloat(r.longitude);
const elevationMeters = r.elevation_meters !== undefined && r.elevation_meters !== null
? Number(r.elevation_meters)
: getElevationMeters(lat, lng);
return {
...r,
name: displayName,
name_ar: displayName,
latitude: parseFloat(r.latitude),
longitude: parseFloat(r.longitude),
latitude: lat,
longitude: lng,
elevation_meters: elevationMeters,
distance_km: r.distance ? (Number(r.distance) / 1000).toFixed(2) : null,
location: { lat: parseFloat(r.latitude), lng: parseFloat(r.longitude) },
location: { lat, lng, elevation: elevationMeters },
full_address,
};
});
@@ -527,12 +535,20 @@ export class GeocodingService {
humanReadable = [iraqiAddress.text, landmark].filter(Boolean).join(' — ');
}
const resLat = parseFloat(r.latitude);
const resLng = parseFloat(r.longitude);
const elevMeters = r.elevation_meters !== undefined && r.elevation_meters !== null
? Number(r.elevation_meters)
: getElevationMeters(resLat, resLng);
return {
...r,
mahalla: iraqiAddress?.mahalla,
zuqaq: iraqiAddress?.zuqaq,
latitude: parseFloat(r.latitude),
longitude: parseFloat(r.longitude),
latitude: resLat,
longitude: resLng,
elevation_meters: elevMeters,
location: { lat: resLat, lng: resLng, elevation: elevMeters },
human_readable_address: humanReadable,
full_address: fullAddressParts.join('، ')
};