From 09774412c0bdcc567f122455092739cd41b4567a Mon Sep 17 00:00:00 2001 From: Matthew Bloch Date: Wed, 19 Jul 2023 16:10:31 -0400 Subject: [PATCH] v0.6.38 --- CHANGELOG.md | 3 +++ package-lock.json | 4 ++-- package.json | 2 +- src/cli/mapshaper-options.mjs | 4 ++++ src/commands/mapshaper-symbols.mjs | 1 + src/symbols/mapshaper-basic-symbols.mjs | 9 +++------ src/symbols/mapshaper-path-symbols.mjs | 5 ++--- src/symbols/mapshaper-ring-symbols.mjs | 3 +++ src/symbols/mapshaper-symbol-utils.mjs | 12 ++++++++++++ 9 files changed, 31 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 87a1fe2f..c30cffae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +v0.6.38 +* Added `-symbols opacity=` option. + v0.6.37 * Support for simple line symbols using `type-arrow head-length=0`. diff --git a/package-lock.json b/package-lock.json index 17ab3788..92114695 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mapshaper", - "version": "0.6.37", + "version": "0.6.38", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "mapshaper", - "version": "0.6.37", + "version": "0.6.38", "license": "MPL-2.0", "dependencies": { "@placemarkio/tokml": "^0.3.3", diff --git a/package.json b/package.json index c429fa55..a7388375 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mapshaper", - "version": "0.6.37", + "version": "0.6.38", "description": "A tool for editing vector datasets for mapping and GIS.", "keywords": [ "shapefile", diff --git a/src/cli/mapshaper-options.mjs b/src/cli/mapshaper-options.mjs index 87bbe08f..4e60a924 100644 --- a/src/cli/mapshaper-options.mjs +++ b/src/cli/mapshaper-options.mjs @@ -1569,6 +1569,10 @@ export function getOptionParser() { .option('stroke-width', { describe: 'symbol line width (linear symbols only)' }) + .option('opacity', { + describe: 'symbol opacity', + type: 'number' + }) .option('geographic', { old_alias: 'polygons', describe: 'make geographic shapes instead of SVG objects', diff --git a/src/commands/mapshaper-symbols.mjs b/src/commands/mapshaper-symbols.mjs index 2ba0ca1b..73ed6397 100644 --- a/src/commands/mapshaper-symbols.mjs +++ b/src/commands/mapshaper-symbols.mjs @@ -71,6 +71,7 @@ cmd.symbols = function(inputLyr, dataset, opts) { scaleAndShiftCoords(coords, metersPerPx, shp[0]); if (d.fill) rec.fill = d.fill; if (d.stroke) rec.stroke = d.stroke; + if (d.opacity) rec.opacity = d.opacity; return createGeometry(coords, geojsonType); } else { rec['svg-symbol'] = makePathSymbol(coords, d, geojsonType); diff --git a/src/symbols/mapshaper-basic-symbols.mjs b/src/symbols/mapshaper-basic-symbols.mjs index fa59aa74..65fc3492 100644 --- a/src/symbols/mapshaper-basic-symbols.mjs +++ b/src/symbols/mapshaper-basic-symbols.mjs @@ -1,16 +1,13 @@ import { getPlanarSegmentEndpoint } from '../geom/mapshaper-geodesic'; -import { getSymbolRadius, getSymbolFillColor } from './mapshaper-symbol-utils'; +import { getSymbolRadius, applySymbolStyles } from './mapshaper-symbol-utils'; import { stop } from '../utils/mapshaper-logging'; export function makeCircleSymbol(d, opts) { var radius = getSymbolRadius(d); // TODO: remove duplication with svg-symbols.js if (+opts.scale) radius *= +opts.scale; - return { - type: 'circle', - fill: getSymbolFillColor(d), - r: radius - }; + var sym = { type: 'circle', r: radius }; + return applySymbolStyles(sym, d); } export function getPolygonCoords(d) { diff --git a/src/symbols/mapshaper-path-symbols.mjs b/src/symbols/mapshaper-path-symbols.mjs index 969fdb3b..f9e01d30 100644 --- a/src/symbols/mapshaper-path-symbols.mjs +++ b/src/symbols/mapshaper-path-symbols.mjs @@ -1,4 +1,4 @@ -import { roundCoordsForSVG, getSymbolFillColor, getSymbolStrokeColor } from '../symbols/mapshaper-symbol-utils'; +import { roundCoordsForSVG, applySymbolStyles } from '../symbols/mapshaper-symbol-utils'; import { error } from '../utils/mapshaper-logging'; import { flattenMultiPolygonCoords } from '../svg/geojson-to-svg'; @@ -8,19 +8,18 @@ export function makePathSymbol(coords, properties, geojsonType) { if (geojsonType == 'MultiPolygon' || geojsonType == 'Polygon') { sym = { type: 'polygon', - fill: getSymbolFillColor(properties), coordinates: geojsonType == 'Polygon' ? coords : flattenMultiPolygonCoords(coords) }; } else if (geojsonType == 'LineString' || geojsonType == 'MultiLineString') { sym = { type: 'polyline', - stroke: getSymbolStrokeColor(properties), 'stroke-width': properties['stroke-width'] || 2, coordinates: geojsonType == 'LineString' ? [coords] : coords }; } else { error('Unsupported type:', geojsonType); } + applySymbolStyles(sym, properties); roundCoordsForSVG(sym.coordinates); return sym; } diff --git a/src/symbols/mapshaper-ring-symbols.mjs b/src/symbols/mapshaper-ring-symbols.mjs index d64027e6..6108c707 100644 --- a/src/symbols/mapshaper-ring-symbols.mjs +++ b/src/symbols/mapshaper-ring-symbols.mjs @@ -10,11 +10,13 @@ export function makeRingSymbol(d, opts) { var radii = parseRings(d.radii || '2').map(function(r) { return r * scale; }); var solidCenter = utils.isOdd(radii.length); var color = getSymbolFillColor(d); + var opacity = opts.opacity || undefined; var parts = []; if (solidCenter) { parts.push({ type: 'circle', fill: color, + opacity: opacity, r: radii.shift() }); } @@ -23,6 +25,7 @@ export function makeRingSymbol(d, opts) { type: 'circle', fill: 'none', // TODO remove default black fill so this is not needed stroke: color, + opacity: opacity, 'stroke-width': roundToTenths(radii[i+1] - radii[i]), r: roundToTenths(radii[i+1] * 0.5 + radii[i] * 0.5) }); diff --git a/src/symbols/mapshaper-symbol-utils.mjs b/src/symbols/mapshaper-symbol-utils.mjs index 4edd48a6..e390ec2c 100644 --- a/src/symbols/mapshaper-symbol-utils.mjs +++ b/src/symbols/mapshaper-symbol-utils.mjs @@ -12,6 +12,18 @@ export function getSymbolStrokeColor(d) { return d.stroke || d.fill || 'magenta'; } +export function applySymbolStyles(sym, d) { + if (sym.type == 'polyline') { + sym.stroke = getSymbolStrokeColor(d); + } else { + sym.fill = getSymbolFillColor(d); + } + if (d.opacity) { + sym.opacity = d.opacity; + } + return sym; +} + export function getSymbolRadius(d) { if (d.radius === 0 || d.length === 0 || d.r === 0) return 0; return d.radius || d.length || d.r || 5; // use a default value