Compare commits

...
1 Commits
Author SHA1 Message Date
livio e93dd9b867 Generate missing imported sheet outline 2026-09-22 10:47:35 +02:00
5 changed files with 81 additions and 17 deletions

No files matched your search

+6 -8
View File
@@ -161,7 +161,7 @@
<input id="gisFileInput" type="file" accept=".kml,.kmz,.geojson,.json,application/vnd.google-earth.kml+xml,application/vnd.google-earth.kmz,application/geo+json" /> <input id="gisFileInput" type="file" accept=".kml,.kmz,.geojson,.json,application/vnd.google-earth.kml+xml,application/vnd.google-earth.kmz,application/geo+json" />
</label> </label>
<label class="toggle-line project-save-option"> <label class="toggle-line project-save-option">
<input type="checkbox" checked="@IncludeKmlSheetLayer" @onchange="ToggleKmlSheetLayer" /> <input type="checkbox" @bind="IncludeKmlSheetLayer" @bind:after="ApplyKmlSheetLayerOption" />
<span>KML/KMZ: includi anche il layer del foglio</span> <span>KML/KMZ: includi anche il layer del foglio</span>
</label> </label>
<small class="field-help"> <small class="field-help">
@@ -170,7 +170,7 @@
: "Disattivato: importa solo i poligoni delle particelle riconosciute.") : "Disattivato: importa solo i poligoni delle particelle riconosciute.")
</small> </small>
<label class="toggle-line project-save-option"> <label class="toggle-line project-save-option">
<input type="checkbox" checked="@ShowImportedSheetLayer" @onchange="ToggleImportedSheetLayer" /> <input type="checkbox" @bind="ShowImportedSheetLayer" @bind:after="ApplyImportedSheetLayerVisibility" />
<span>Mostra cornice/layer del foglio importato</span> <span>Mostra cornice/layer del foglio importato</span>
</label> </label>
<small class="field-help">La cornice grande resta separata dalle particelle e puo essere nascosta anche nei progetti salvati.</small> <small class="field-help">La cornice grande resta separata dalle particelle e puo essere nascosta anche nei progetti salvati.</small>
@@ -295,7 +295,7 @@
<section class="panel-section"> <section class="panel-section">
<h2>Visualizzazione progetto</h2> <h2>Visualizzazione progetto</h2>
<label class="toggle-line project-save-option"> <label class="toggle-line project-save-option">
<input type="checkbox" checked="@ShowImportedSheetLayer" @onchange="ToggleImportedSheetLayer" /> <input type="checkbox" @bind="ShowImportedSheetLayer" @bind:after="ApplyImportedSheetLayerVisibility" />
<span>Mostra cornice/layer del foglio importato</span> <span>Mostra cornice/layer del foglio importato</span>
</label> </label>
<small class="field-help">Il comando agisce subito sulla mappa e sui dati del progetto caricato.</small> <small class="field-help">Il comando agisce subito sulla mappa e sui dati del progetto caricato.</small>
@@ -973,18 +973,16 @@
} }
private Task AddProjectMarker() => JS.InvokeVoidAsync("lmeMap.addProjectMarker", PoiName).AsTask(); private Task AddProjectMarker() => JS.InvokeVoidAsync("lmeMap.addProjectMarker", PoiName).AsTask();
private async Task ToggleKmlSheetLayer(ChangeEventArgs args) private async Task ApplyKmlSheetLayerOption()
{ {
IncludeKmlSheetLayer = (bool?)args.Value == true;
ShowImportedSheetLayer = IncludeKmlSheetLayer; ShowImportedSheetLayer = IncludeKmlSheetLayer;
await JS.InvokeVoidAsync("lmeMap.setIncludeKmlSheetLayer", IncludeKmlSheetLayer); await JS.InvokeVoidAsync("lmeMap.setIncludeKmlSheetLayer", IncludeKmlSheetLayer);
await JS.InvokeVoidAsync("lmeMap.setImportedSheetLayerVisible", ShowImportedSheetLayer); await JS.InvokeVoidAsync("lmeMap.setImportedSheetLayerVisible", ShowImportedSheetLayer);
} }
private async Task ToggleImportedSheetLayer(ChangeEventArgs args) private Task ApplyImportedSheetLayerVisibility()
{ {
ShowImportedSheetLayer = (bool?)args.Value == true; return JS.InvokeVoidAsync("lmeMap.setImportedSheetLayerVisible", ShowImportedSheetLayer).AsTask();
await JS.InvokeVoidAsync("lmeMap.setImportedSheetLayerVisible", ShowImportedSheetLayer);
} }
private async Task ToggleImportedMeasurements(ChangeEventArgs args) private async Task ToggleImportedMeasurements(ChangeEventArgs args)
+2 -2
View File
@@ -28,8 +28,8 @@
<ApplicationId>com.companyname.lmemappecatastaliapp</ApplicationId> <ApplicationId>com.companyname.lmemappecatastaliapp</ApplicationId>
<!-- Versions --> <!-- Versions -->
<ApplicationDisplayVersion>0.2.15</ApplicationDisplayVersion> <ApplicationDisplayVersion>0.2.16</ApplicationDisplayVersion>
<ApplicationVersion>19</ApplicationVersion> <ApplicationVersion>20</ApplicationVersion>
<!-- To develop, package, and publish an app to the Microsoft Store, see: https://aka.ms/MauiTemplateUnpackaged --> <!-- To develop, package, and publish an app to the Microsoft Store, see: https://aka.ms/MauiTemplateUnpackaged -->
<WindowsPackageType>None</WindowsPackageType> <WindowsPackageType>None</WindowsPackageType>
+1 -1
View File
@@ -13,7 +13,7 @@ public sealed class AzureMapsService
public AzureMapsService() public AzureMapsService()
{ {
_httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("LMEMappeCatastali/0.2.15"); _httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("LMEMappeCatastali/0.2.16");
_httpClient.DefaultRequestHeaders.Accept.ParseAdd("application/json"); _httpClient.DefaultRequestHeaders.Accept.ParseAdd("application/json");
} }
+1 -1
View File
@@ -13,7 +13,7 @@ public sealed class NetworkLocationService
public NetworkLocationService() public NetworkLocationService()
{ {
httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("LMEMappeCatastali/0.2.15"); httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("LMEMappeCatastali/0.2.16");
} }
public async Task<NetworkLocationSnapshot?> GetApproximateLocationAsync( public async Task<NetworkLocationSnapshot?> GetApproximateLocationAsync(
+71 -5
View File
@@ -132,6 +132,8 @@ function init() {
}); });
lmeState.currentBase = lmeState.baseLayers.satellite.addTo(lmeState.map); lmeState.currentBase = lmeState.baseLayers.satellite.addTo(lmeState.map);
const importedSheetPane = lmeState.map.createPane("importedSheetPane");
importedSheetPane.style.zIndex = "520";
lmeState.imported = L.featureGroup().addTo(lmeState.map); lmeState.imported = L.featureGroup().addTo(lmeState.map);
lmeState.importedSheets = L.featureGroup(); lmeState.importedSheets = L.featureGroup();
lmeState.drawings = L.featureGroup().addTo(lmeState.map); lmeState.drawings = L.featureGroup().addTo(lmeState.map);
@@ -887,13 +889,76 @@ function setIncludeKmlSheetLayer(enabled) {
function setImportedSheetLayerVisible(enabled) { function setImportedSheetLayerVisible(enabled) {
migrateMisclassifiedImportedSheets(); migrateMisclassifiedImportedSheets();
lmeState.importedSheetsVisible = Boolean(enabled); lmeState.importedSheetsVisible = Boolean(enabled);
const generated = lmeState.importedSheetsVisible && ensureImportedSheetOutline();
applyImportedSheetVisibility(); applyImportedSheetVisibility();
const count = lmeState.importedSheets?.toGeoJSON()?.features?.length || 0; const count = lmeState.importedSheets?.toGeoJSON()?.features?.length || 0;
setInfo(lmeState.importedSheetsVisible setInfo(lmeState.importedSheetsVisible
? (count ? `Layer del foglio importato visibile (${count} elementi).` : "Nessun layer del foglio importato: ricarica il KML/KMZ con 'includi anche il layer del foglio' attivo.") ? (count
? `${generated ? "Cornice generata dai dati importati" : "Layer del foglio importato visibile"} (${count} elementi).`
: "Nessun dato importato da cui ricavare la cornice del foglio.")
: "Layer del foglio importato nascosto; le particelle restano visibili."); : "Layer del foglio importato nascosto; le particelle restano visibili.");
} }
function ensureImportedSheetOutline() {
if (!lmeState.imported || !lmeState.importedSheets) {
return false;
}
const currentSheets = lmeState.importedSheets.toGeoJSON();
const hasAreaOutline = (currentSheets.features || []).some(feature =>
["Polygon", "MultiPolygon"].includes(feature?.geometry?.type));
if (hasAreaOutline) {
return false;
}
const imported = lmeState.imported.toGeoJSON();
const points = collectGeoJsonCoordinates(imported);
if (!points.length) {
return false;
}
const bounds = points.reduce((result, point) => ({
west: Math.min(result.west, point[0]),
south: Math.min(result.south, point[1]),
east: Math.max(result.east, point[0]),
north: Math.max(result.north, point[1])
}), { west: Infinity, south: Infinity, east: -Infinity, north: -Infinity });
if (!Number.isFinite(bounds.west)
|| !Number.isFinite(bounds.south)
|| bounds.east <= bounds.west
|| bounds.north <= bounds.south) {
return false;
}
const longitudePadding = Math.max((bounds.east - bounds.west) * 0.01, 0.000001);
const latitudePadding = Math.max((bounds.north - bounds.south) * 0.01, 0.000001);
const west = bounds.west - longitudePadding;
const south = bounds.south - latitudePadding;
const east = bounds.east + longitudePadding;
const north = bounds.north + latitudePadding;
addImportedSheetFeatures({
type: "FeatureCollection",
features: [{
type: "Feature",
properties: {
name: "Cornice del foglio importato",
_lmeGeneratedSheetOutline: true
},
geometry: {
type: "Polygon",
coordinates: [[
[west, south],
[east, south],
[east, north],
[west, north],
[west, south]
]]
}
}]
});
return true;
}
function migrateMisclassifiedImportedSheets() { function migrateMisclassifiedImportedSheets() {
if (!lmeState.imported || !lmeState.importedSheets) { if (!lmeState.imported || !lmeState.importedSheets) {
return 0; return 0;
@@ -928,8 +993,10 @@ function addImportedFeatures(geojson) {
function addImportedSheetFeatures(geojson) { function addImportedSheetFeatures(geojson) {
return L.geoJSON(geojson || emptyFeatureCollection(), { return L.geoJSON(geojson || emptyFeatureCollection(), {
pane: "importedSheetPane",
style: { color: "#f59e0b", weight: 4, opacity: 1, fillOpacity: 0.03, dashArray: "10 6" }, style: { color: "#f59e0b", weight: 4, opacity: 1, fillOpacity: 0.03, dashArray: "10 6" },
pointToLayer: (feature, latlng) => L.circleMarker(latlng, { pointToLayer: (feature, latlng) => L.circleMarker(latlng, {
pane: "importedSheetPane",
radius: 7, radius: 7,
color: "#f59e0b", color: "#f59e0b",
fillColor: "#ffffff", fillColor: "#ffffff",
@@ -948,10 +1015,6 @@ function applyImportedSheetVisibility() {
lmeState.importedSheets.addTo(lmeState.map); lmeState.importedSheets.addTo(lmeState.map);
} }
lmeState.importedSheets.bringToFront(); lmeState.importedSheets.bringToFront();
lmeState.imported.bringToFront();
lmeState.selectedParcelsLayer.bringToFront();
lmeState.gpsParcelLayer.bringToFront();
lmeState.drawings.bringToFront();
return; return;
} }
if (lmeState.map.hasLayer(lmeState.importedSheets)) { if (lmeState.map.hasLayer(lmeState.importedSheets)) {
@@ -1568,6 +1631,9 @@ function loadProjectSnapshot(raw, projectName) {
lmeState.importedSheetsVisible = projectDisplayOptions lmeState.importedSheetsVisible = projectDisplayOptions
? Boolean(projectDisplayOptions.importedSheetsVisible) ? Boolean(projectDisplayOptions.importedSheetsVisible)
: data.schemaVersion >= 2 && Boolean(data.importedSheetsVisible); : data.schemaVersion >= 2 && Boolean(data.importedSheetsVisible);
if (lmeState.importedSheetsVisible) {
ensureImportedSheetOutline();
}
applyImportedSheetVisibility(); applyImportedSheetVisibility();
L.geoJSON(data.selectedParcels || emptyFeatureCollection(), { L.geoJSON(data.selectedParcels || emptyFeatureCollection(), {
style: { color: "#ef4444", weight: 4, opacity: 1, fillColor: "#fbbf24", fillOpacity: 0.26 }, style: { color: "#ef4444", weight: 4, opacity: 1, fillColor: "#fbbf24", fillOpacity: 0.26 },