diff --git a/index.html b/index.html index 1178f57..519804d 100644 --- a/index.html +++ b/index.html @@ -1737,23 +1737,23 @@ labelLayers[v.id].addTo(map); } - // Allow vertex insertion by clicking anywhere on the polyline - routeLayers[v.id].on('click', (e) => { - if (!v.active) return; - if (!map.editTools) return; - - L.DomEvent.stopPropagation(e); - - const layer = routeLayers[v.id]; const point = e.latlng; const latlngs = layer.getLatLngs(); - const vertexIndex = findClosestSegmentIndex(latlngs, point); + + // Use Turf for much better snapping to the line + const line = turf.lineString(latlngs.map(ll => [ll.lng, ll.lat])); + const snapped = turf.nearestPointOnLine(line, [point.lng, point.lat]); + const snappedPt = L.latLng(snapped.geometry.coordinates[1], snapped.geometry.coordinates[0]); + + // Find where to insert it based on the snap result + const vertexIndex = findClosestSegmentIndex(latlngs, snappedPt); if (vertexIndex !== -1) { - latlngs.splice(vertexIndex + 1, 0, point); + latlngs.splice(vertexIndex + 1, 0, snappedPt); layer.setLatLngs(latlngs); if (layer.editor) layer.editor.refresh(); + v.routes = latlngs.map(ll => ({ lat: ll.lat, lng: ll.lng })); calculateStats(v); updateVariantStatsUI(v); updateRouteLabels(v); @@ -2067,7 +2067,8 @@ const vDrill = drillingLayers[variant.id]; if (vDrill) vDrill.clearLayers(); - const latLngs = (variant.routes || []).map(ll => { + const layer = routeLayers[variant.id]; + const latLngs = layer ? layer.getLatLngs() : (variant.routes || []).map(ll => { try { return L.latLng(ll); } catch(e) { return null; } }).filter(p => !!p && typeof p.lat === 'number'); @@ -2077,7 +2078,7 @@ variant.stats.hasTooLongDrilling = false; variant.drillingSegments = []; - if (latLngs.length < 2) { + if (!latLngs || latLngs.length < 2) { renderSegmentLabels(variant); return; }