diff --git a/data/mapfiles/polygon_simple_polygon_outline.map b/data/mapfiles/polygon_simple_polygon_outline.map new file mode 100644 index 0000000..703ed4a --- /dev/null +++ b/data/mapfiles/polygon_simple_polygon_outline.map @@ -0,0 +1,19 @@ +LAYER + NAME "polygon_simple_polygon_outline" + TYPE POLYGON + DATA "../shapes/polygons.shp" + EXTENT -180 -90 180 90 + METADATA + "wms_title" "polygon_simple_polygon_outline.map" + "wms_srs" "EPSG:4326" + END + CLASS + STYLE + COLOR 0 255 0 + END + STYLE + OUTLINECOLOR 85 85 85 + OUTLINEWIDTH 0.1 + END + END +END diff --git a/data/styles/polygon_simple_polygon.ts b/data/styles/polygon_simple_polygon.ts index 94e8811..114af1e 100644 --- a/data/styles/polygon_simple_polygon.ts +++ b/data/styles/polygon_simple_polygon.ts @@ -7,7 +7,9 @@ const polygonStyle: Style = { symbolizers: [{ kind: 'Fill', color: '#00FF00', - outlineColor: '#555555' + fillOpacity: 1, + outlineColor: '#555555', + outlineOpacity: 1 }] }] }; diff --git a/data/styles/polygon_simple_polygon_outline.ts b/data/styles/polygon_simple_polygon_outline.ts new file mode 100644 index 0000000..31e27db --- /dev/null +++ b/data/styles/polygon_simple_polygon_outline.ts @@ -0,0 +1,21 @@ +import { Style } from 'geostyler-style'; + +const polygonStyle: Style = { + name: 'polygon_simple_polygon_outline', + rules: [ + { + name: '', + symbolizers: [ + { kind: 'Fill', outlineOpacity: 0, color: '#00FF00', fillOpacity: 1 }, + { + kind: 'Fill', + outlineColor: '#555555', + fillOpacity: 0, + outlineWidth: 0.1, + outlineOpacity: 1 + } + ] + } + ] +}; +export default polygonStyle; diff --git a/src/MapfileStyleParser.spec.ts b/src/MapfileStyleParser.spec.ts index 8d87922..bdb4964 100644 --- a/src/MapfileStyleParser.spec.ts +++ b/src/MapfileStyleParser.spec.ts @@ -7,6 +7,7 @@ import { SldStyleParser } from 'geostyler-sld-parser'; import point_simple_point from '../data/styles/point_simple_point'; import line_simple_line from '../data/styles/line_simple_line'; import polygon_simple_polygon from '../data/styles/polygon_simple_polygon'; +import polygon_simple_polygon_outline from '../data/styles/polygon_simple_polygon_outline'; import raster_simple_raster from '../data/styles/raster_simple_raster'; import point_simple_rgb_to_hex from '../data/styles/point_simple_rgb_to_hex'; @@ -69,6 +70,14 @@ describe('MapfileStyleParser implements StyleParser', () => { expect(geoStylerStyle).toEqual(polygon_simple_polygon); }); + it('can read a simple MapFile PolygonSymbolizer with seperate outline', async () => { + expect.assertions(2); + const mapfile = fs.readFileSync( './data/mapfiles/polygon_simple_polygon_outline.map', 'utf8'); + const geoStylerStyle = await styleParser.readStyle(mapfile); + expect(geoStylerStyle).toBeDefined(); + expect(geoStylerStyle).toEqual(polygon_simple_polygon_outline); + }); + it('can read a simple MapFile RasterSymbolizer', async () => { expect.assertions(2); const mapfile = fs.readFileSync( './data/mapfiles/raster_simple_raster.map', 'utf8'); diff --git a/src/MapfileStyleParser.ts b/src/MapfileStyleParser.ts index 5e75dc2..95fa4a2 100644 --- a/src/MapfileStyleParser.ts +++ b/src/MapfileStyleParser.ts @@ -624,14 +624,30 @@ export class MapfileStyleParser implements StyleParser { fillSymbolizer.graphicFill = this.getPointSymbolizerFromMapfileStyle(mapfileStyle); } + if (mapfileStyle.color) { + fillSymbolizer.fillOpacity = mapfileStyle.opacity / 100 || 1; + + if (!mapfileStyle.outlinecolor) { + fillSymbolizer.outlineOpacity = 0; + } + } + if (mapfileStyle.outlinecolor) { + fillSymbolizer.outlineOpacity = mapfileStyle.opacity / 100 || 1; fillSymbolizer.outlineColor = isHex(mapfileStyle.outlinecolor) ? mapfileStyle.outlinecolor : rgbToHex(mapfileStyle.outlinecolor); + + if (mapfileStyle.width) { + fillSymbolizer.outlineWidth = mapfileStyle.width; + } + if (!mapfileStyle.color) { + fillSymbolizer.fillOpacity = 0; + } } if (mapfileStyle.outlinewidth) { - fillSymbolizer.outlineWidth = mapfileStyle.outlinewidth; + fillSymbolizer.outlineWidth = parseFloat(mapfileStyle.outlinewidth as unknown as string); } if (mapfileStyle.opacity) { @@ -827,7 +843,6 @@ export class MapfileStyleParser implements StyleParser { this.checkWarnDropRule('MAXSCALEDENOM', 'LABEL', mapfileLabel.maxscaledenom); }); } - return symbolizers; }