Add world coordinate export for burgs with improved unit conversion

- Added X_World and Y_World columns in meters to CSV export
- Enhanced distance unit conversion with support for multiple units (km, m, mi, yd, ft, leagues)
- Renamed existing X,Y columns to X_Pixel, Y_Pixel for clarity
- World coordinates account for proper Y-axis orientation (negative for downward direction)
- Maintains backward compatibility with existing latitude/longitude columns
This commit is contained in:
barrulus 2025-08-12 18:30:21 +01:00
parent bcce33e046
commit 51572e34a8

View file

@ -480,8 +480,49 @@ function overviewBurgs(settings = {stateId: null, cultureId: null}) {
});
}
// Helper function to get meters per pixel (add this if it doesn't exist)
function getMetersPerPixel() {
const unit = distanceUnitInput.value.toLowerCase();
switch(unit) {
case 'km':
return distanceScale * 1000;
case 'm':
case 'meter':
case 'meters':
return distanceScale;
case 'mi':
case 'mile':
case 'miles':
return distanceScale * 1609.344;
case 'yd':
case 'yard':
case 'yards':
return distanceScale * 0.9144;
case 'ft':
case 'foot':
case 'feet':
return distanceScale * 0.3048;
case 'league':
case 'leagues':
return distanceScale * 4828.032;
default:
console.warn(`Unknown distance unit: ${unit}, defaulting to km`);
return distanceScale * 1000;
}
}
function downloadBurgsData() {
let data = `Id,Burg,Province,Province Full Name,State,State Full Name,Culture,Religion,Population,X,Y,Latitude,Longitude,Elevation (${heightUnit.value}),Temperature,Temperature likeness,Capital,Port,Citadel,Walls,Plaza,Temple,Shanty Town,Emblem,City Generator Link\n`; // headers
// Calculate meters per pixel for world coordinates
const metersPerPixel = getMetersPerPixel();
// Build headers with new world coordinate columns
let data = `Id,Burg,Province,Province Full Name,State,State Full Name,Culture,Religion,Population,`;
data += `X_World (m),Y_World (m),X_Pixel,Y_Pixel,`; // New world coords + renamed pixel coords
data += `Latitude,Longitude,`; // Keep for compatibility
data += `Elevation (${heightUnit.value}),Temperature,Temperature likeness,`;
data += `Capital,Port,Citadel,Walls,Plaza,Temple,Shanty Town,Emblem,City Generator Link\n`;
const valid = pack.burgs.filter(b => b.i && !b.removed); // all valid burgs
valid.forEach(b => {
@ -496,17 +537,27 @@ function overviewBurgs(settings = {stateId: null, cultureId: null}) {
data += pack.religions[pack.cells.religion[b.cell]].name + ",";
data += rn(b.population * populationRate * urbanization) + ",";
// add geography data
// Add world coordinates in meters
const xWorld = b.x * metersPerPixel;
const yWorld = -b.y * metersPerPixel; // Negative because Y increases downward
data += rn(xWorld, 2) + ",";
data += rn(yWorld, 2) + ",";
// Add pixel coordinates (renamed for clarity)
data += b.x + ",";
data += b.y + ",";
// Keep lat/lon for compatibility (even though not used in fantasy map)
data += getLatitude(b.y, 2) + ",";
data += getLongitude(b.x, 2) + ",";
// Continue with elevation and other data
data += parseInt(getHeight(pack.cells.h[b.cell])) + ",";
const temperature = grid.cells.temp[pack.cells.g[b.cell]];
data += convertTemperature(temperature) + ",";
data += getTemperatureLikeness(temperature) + ",";
// add status data
// Add status data
data += b.capital ? "capital," : ",";
data += b.port ? "port," : ",";
data += b.citadel ? "citadel," : ",";