Made a quick 'n dirty tool to simplify continent polygons. Used it to provide quicker continent lookups.
parent
6ed986bfc3
commit
453069b33b
8 changed files with 1952 additions and 58 deletions
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@ -0,0 +1,113 @@ |
|||||||
|
<!DOCTYPE html> |
||||||
|
<meta charset="utf-8"> |
||||||
|
|
||||||
|
<body> |
||||||
|
<h1>Concaveman</h1> |
||||||
|
<p> |
||||||
|
An interactive demo of <a href="https://github.com/mapbox/concaveman">concaveman</a> - a Javascript module for |
||||||
|
fast 2D concave hulls. Use the sliders to visualize the effect of the two parameters, concavity and |
||||||
|
lengthThreshold. |
||||||
|
</p> |
||||||
|
<div> |
||||||
|
<label for="concavity">Concavity </label> |
||||||
|
<input type="range" oninput="updateConcavity(this.value)" id="concavity" min="0" value="2.0" max="3.2" |
||||||
|
step="0.05"> |
||||||
|
<input type="text" id="concavityText" value="2.0"> |
||||||
|
<label for="lengthThreshold"> Length Threshold</label> |
||||||
|
<input type="range" oninput="updateLengthThreshold(this.value)" id="lengthThreshold" min="0" value="0" max="100" |
||||||
|
step="1"> |
||||||
|
<input type="text" id="lengthThresholdText" value="0.0"> |
||||||
|
</div> |
||||||
|
<br> |
||||||
|
|
||||||
|
<script src="https://d3js.org/d3.v3.min.js"></script> |
||||||
|
<script src="./concaveman-bundle.js"></script> |
||||||
|
<script type="text/javascript" language="javascript" src="continent_polygons.geojson_var"></script> |
||||||
|
<script> |
||||||
|
var width = 2000, |
||||||
|
height = 2000, |
||||||
|
minx = -200, |
||||||
|
miny = -100, |
||||||
|
scale = 3; |
||||||
|
|
||||||
|
var concavity = 2.0; |
||||||
|
var lengthThreshold = 0.0; |
||||||
|
|
||||||
|
function updateConcavity(val) { |
||||||
|
concavity = val; |
||||||
|
document.getElementById('concavityText').value = val; |
||||||
|
updateConcaveHull(); |
||||||
|
}; |
||||||
|
function updateLengthThreshold(val) { |
||||||
|
lengthThreshold = val; |
||||||
|
document.getElementById('lengthThresholdText').value = val; |
||||||
|
updateConcaveHull(); |
||||||
|
}; |
||||||
|
function get_all_points(geojson) { |
||||||
|
var points = []; |
||||||
|
if (geojson.type == "Polygon") { |
||||||
|
geojson.coordinates[0].forEach(e => points.push(e)); |
||||||
|
} else if (geojson.type == "MultiPolygon") { |
||||||
|
for (let i = 0; i < geojson.coordinates.length; i++) { |
||||||
|
geojson.coordinates[i][0].forEach(e => points.push(e)); |
||||||
|
} |
||||||
|
} |
||||||
|
return points; |
||||||
|
} |
||||||
|
|
||||||
|
console.log("GEOJson: ", geojson); |
||||||
|
var points = geojson.features.map(feature => { |
||||||
|
return get_all_points(feature.geometry); |
||||||
|
}); |
||||||
|
console.log(points); |
||||||
|
|
||||||
|
var svg = d3.select("body").append("svg") |
||||||
|
.attr("width", width) |
||||||
|
.attr("height", height); |
||||||
|
|
||||||
|
// svg.selectAll('circle') |
||||||
|
// .data(points) |
||||||
|
// .enter() |
||||||
|
// .append('circle') |
||||||
|
// .attr("cx", function (d) { return (d[0] - minx) * scale; }) |
||||||
|
// .attr("cy", function (d) { return (d[1] - miny) * scale; }) |
||||||
|
// .attr("r", 2); |
||||||
|
|
||||||
|
function updateConcaveHull() { |
||||||
|
svg.selectAll('polygon').remove(); |
||||||
|
svg.selectAll('polygon') |
||||||
|
//.data([concaveman(points, concavity, lengthThreshold)]) |
||||||
|
.data(points.map(partpoints => { |
||||||
|
return concaveman(partpoints, concavity, lengthThreshold) |
||||||
|
})) |
||||||
|
.enter() |
||||||
|
.append('polygon') |
||||||
|
.attr('points', function (points) { |
||||||
|
data = "" |
||||||
|
for (var i = points.length; i--;) { |
||||||
|
data += [(points[i][0] - minx) * scale, (points[i][1] - miny) * scale].join(','); |
||||||
|
data += " "; |
||||||
|
} |
||||||
|
data += [(points[0][0] - minx) * scale, (points[0][1] - miny) * scale].join(','); |
||||||
|
|
||||||
|
return data |
||||||
|
}) |
||||||
|
.attr('stroke', 'black') |
||||||
|
.attr('fill', 'yellow') |
||||||
|
.attr('opacity', 0.2) |
||||||
|
.attr('stroke-width', 1); |
||||||
|
|
||||||
|
var new_geojson = geojson; |
||||||
|
for(let i=0; i<new_geojson.features.length; i++) { |
||||||
|
new_geojson.features[i].geometry.type = "MultiPolygon"; |
||||||
|
new_geojson.features[i].geometry.coordinates = [[ |
||||||
|
concaveman(points[i], concavity, lengthThreshold) |
||||||
|
]]; |
||||||
|
}; |
||||||
|
console.log("New GeoJSON: ", new_geojson); |
||||||
|
console.log(JSON.stringify(new_geojson)); |
||||||
|
}; |
||||||
|
|
||||||
|
updateConcaveHull(); |
||||||
|
</script> |
||||||
|
</body> |
File diff suppressed because one or more lines are too long
Loading…
Reference in new issue