From e8fd41abae382f39f17a561a1461db90bd2204f3 Mon Sep 17 00:00:00 2001 From: ryanhamley Date: Wed, 29 Aug 2018 14:39:41 -0700 Subject: [PATCH] Add symbol-z-order property to symbol layout style spec --- src/data/bucket/symbol_bucket.js | 5 +- src/style-spec/reference/v8.json | 26 +++++ src/style-spec/types.js | 1 + .../symbol_style_layer_properties.js | 2 + .../symbol-z-order/default/expected.png | Bin 0 -> 2248 bytes .../symbol-z-order/default/style.json | 75 +++++++++++++++ .../symbol-z-order/disabled/expected.png | Bin 0 -> 2245 bytes .../symbol-z-order/disabled/style.json | 76 +++++++++++++++ .../icon-with-text/expected.png | Bin 0 -> 4537 bytes .../symbol-z-order/icon-with-text/style.json | 89 ++++++++++++++++++ .../symbol-z-order/pitched/expected.png | Bin 0 -> 2404 bytes .../symbol-z-order/pitched/style.json | 77 +++++++++++++++ 12 files changed, 349 insertions(+), 2 deletions(-) create mode 100644 test/integration/render-tests/symbol-z-order/default/expected.png create mode 100644 test/integration/render-tests/symbol-z-order/default/style.json create mode 100644 test/integration/render-tests/symbol-z-order/disabled/expected.png create mode 100644 test/integration/render-tests/symbol-z-order/disabled/style.json create mode 100644 test/integration/render-tests/symbol-z-order/icon-with-text/expected.png create mode 100644 test/integration/render-tests/symbol-z-order/icon-with-text/style.json create mode 100644 test/integration/render-tests/symbol-z-order/pitched/expected.png create mode 100644 test/integration/render-tests/symbol-z-order/pitched/style.json diff --git a/src/data/bucket/symbol_bucket.js b/src/data/bucket/symbol_bucket.js index f096cf1cb16..17aa10c4d13 100644 --- a/src/data/bucket/symbol_bucket.js +++ b/src/data/bucket/symbol_bucket.js @@ -291,8 +291,9 @@ class SymbolBucket implements Bucket { this.iconSizeData = getSizeData(this.zoom, unevaluatedLayoutValues['icon-size']); const layout = this.layers[0].layout; - this.sortFeaturesByY = layout.get('text-allow-overlap') || layout.get('icon-allow-overlap') || - layout.get('text-ignore-placement') || layout.get('icon-ignore-placement'); + const zOrderByViewportY = layout.get('symbol-z-order') === 'viewport-y'; + this.sortFeaturesByY = zOrderByViewportY && (layout.get('text-allow-overlap') || layout.get('icon-allow-overlap') || + layout.get('text-ignore-placement') || layout.get('icon-ignore-placement')); this.sourceID = options.sourceID; } diff --git a/src/style-spec/reference/v8.json b/src/style-spec/reference/v8.json index 5b98fc6d5af..8a9cbc65895 100644 --- a/src/style-spec/reference/v8.json +++ b/src/style-spec/reference/v8.json @@ -955,6 +955,32 @@ }, "property-type": "data-constant" }, + "symbol-z-order": { + "type": "enum", + "values": { + "viewport-y": { + "doc": "Symbols will be sorted by their y-position relative to the viewport." + }, + "source": { + "doc": "Symbols will be rendered in the same order as the source data with no sorting applied." + } + }, + "default": "viewport-y", + "doc": "Controls the order in which overlapping symbols in the same layer are rendered", + "sdk-support": { + "basic functionality": { + "js": "0.49.0" + }, + "data-driven styling": {} + }, + "expression": { + "interpolated": false, + "parameters": [ + "zoom" + ] + }, + "property-type": "data-constant" + }, "icon-allow-overlap": { "type": "boolean", "default": false, diff --git a/src/style-spec/types.js b/src/style-spec/types.js index a89ba2bb030..2e7c5d30166 100644 --- a/src/style-spec/types.js +++ b/src/style-spec/types.js @@ -212,6 +212,7 @@ export type SymbolLayerSpecification = {| "symbol-placement"?: PropertyValueSpecification<"point" | "line" | "line-center">, "symbol-spacing"?: PropertyValueSpecification, "symbol-avoid-edges"?: PropertyValueSpecification, + "symbol-z-order"?: PropertyValueSpecification<"viewport-y" | "source">, "icon-allow-overlap"?: PropertyValueSpecification, "icon-ignore-placement"?: PropertyValueSpecification, "icon-optional"?: PropertyValueSpecification, diff --git a/src/style/style_layer/symbol_style_layer_properties.js b/src/style/style_layer/symbol_style_layer_properties.js index 3f9ae4652b4..adf350a093e 100644 --- a/src/style/style_layer/symbol_style_layer_properties.js +++ b/src/style/style_layer/symbol_style_layer_properties.js @@ -21,6 +21,7 @@ export type LayoutProps = {| "symbol-placement": DataConstantProperty<"point" | "line" | "line-center">, "symbol-spacing": DataConstantProperty, "symbol-avoid-edges": DataConstantProperty, + "symbol-z-order": DataConstantProperty, "icon-allow-overlap": DataConstantProperty, "icon-ignore-placement": DataConstantProperty, "icon-optional": DataConstantProperty, @@ -60,6 +61,7 @@ const layout: Properties = new Properties({ "symbol-placement": new DataConstantProperty(styleSpec["layout_symbol"]["symbol-placement"]), "symbol-spacing": new DataConstantProperty(styleSpec["layout_symbol"]["symbol-spacing"]), "symbol-avoid-edges": new DataConstantProperty(styleSpec["layout_symbol"]["symbol-avoid-edges"]), + "symbol-z-order": new DataConstantProperty(styleSpec["layout_symbol"]["symbol-z-order"]), "icon-allow-overlap": new DataConstantProperty(styleSpec["layout_symbol"]["icon-allow-overlap"]), "icon-ignore-placement": new DataConstantProperty(styleSpec["layout_symbol"]["icon-ignore-placement"]), "icon-optional": new DataConstantProperty(styleSpec["layout_symbol"]["icon-optional"]), diff --git a/test/integration/render-tests/symbol-z-order/default/expected.png b/test/integration/render-tests/symbol-z-order/default/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..62fd023d96cc13f4d6352789375914216f89c212 GIT binary patch literal 2248 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 HN6-HUsjJ^4 literal 0 HcmV?d00001 diff --git a/test/integration/render-tests/symbol-z-order/icon-with-text/style.json b/test/integration/render-tests/symbol-z-order/icon-with-text/style.json new file mode 100644 index 00000000000..e4bbfbae7f8 --- /dev/null +++ b/test/integration/render-tests/symbol-z-order/icon-with-text/style.json @@ -0,0 +1,89 @@ +{ + "version": 8, + "metadata": { + "test": { + "height": 128, + "width": 128 + } + }, + "center": [ + 0, + 0 + ], + "zoom": 0, + "pitch": 60, + "sources": { + "icon-source": { + "type": "geojson", + "data": { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 7, + 7 + ] + }, + "properties": { + "icon": "building", + "title": "building" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 14, + 14 + ] + }, + "properties": { + "icon": "restaurant", + "title": "restaurant" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 0, + 0 + ] + }, + "properties": { + "icon": "school", + "title": "school" + } + } + ] + } + } + }, + "sprite": "local://sprites/sprite", + "glyphs": "local://glyphs/{fontstack}/{range}.pbf", + "layers": [ + { + "id": "icons", + "type": "symbol", + "source": "icon-source", + "layout": { + "symbol-z-order": "source", + "icon-image": "{icon}-12", + "icon-allow-overlap": true, + "text-allow-overlap": true, + "text-field": "{title}", + "text-font": ["Open Sans Semibold", "Arial Unicode MS Bold"], + "text-offset": [0, 0.6], + "text-anchor": "top" + }, + "paint": { + "text-color": "#ffffff" + } + } + ] +} diff --git a/test/integration/render-tests/symbol-z-order/pitched/expected.png b/test/integration/render-tests/symbol-z-order/pitched/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..1eb86b3535968406201e3c63abe211556b4c6d58 GIT binary patch literal 2404 zcmb7Gc{me}8+Rr5Iljnp%o%+hbB)ku#%3uabS=bKa@I;AN7N9RQIn%rInHrr`Uvac)y=#_y5xlLzAsVq^qWu+P;Q>6eIvl|p>5AASTXfll$h7)=05%vhjvyz=#z zlBBNYlaI1=>Uaac8TR)3hHJmFcZfnMP>Kt~u@sieb>})XQ0FCq@)M7~X&cKF6Eib7DRRzSv+^WDDCUOLJ=YF&f~%JG?~wkI zmCm+e1jhV>DzOz+DTCc^baMl^m4ghk@`~>CX5mJN)gH-=RvWURitp{hw*p{OQ!p%N zy=Ur1+^<(RD5^C13=$G|Su+Gvl0`*d{AS0ccEJb)Q!9|UhDo{jWrMuChkb9YL#H|{TwFvU33{h% zcNKne@2s-#Wkrf+`bpp(%F9FHEmCMGD1_SC6D=R>5!46+BJ*+Hmv=+3Q-`7mnwJEC zEqg*7ptsXHq~1pxYqTMbMj~TD1yx^X24#!dNQ$7waWMSKv?&=4q9m)91*n-FHx&l= z6YM2qYiA)gqMi*fk_OTW(Mrke>2YPQ$*G zG~I9+7<%_0t^72#z8W6tnIFvEFts8jsou>b8 zQK60mJ%2UdU!k?vjYP&0RVhjT1N*i)brqYAo02TEaxYik@hKR07Ax~p#!pMj&@v}i zjij>&tb^pMBn1N@%V7m#T`$JR@CH7$eV@b+=jR%Rci7*VG!EF;|IWk|R3&wc%(x&d zKgE6@zZ18$u)p%mtHk@7t&Mk8jqwM;#X(eQX^L|{v3!w|l^>}xZ>sH>_pUkUPE&zh})cX-@nIBn5U=89)=g2T$j*h*vPYtA?Y z{G^=<6YwIzt{EFl5JUt9TFbQPy@>s8&$kCwV}cb4{yOj?N&DOs}k-x#?MIW z6@8F0tW89?gJS_hE)DdE{Ygiot&sVx!xf;AK#W1|=>TH~uhv!bFC`gs zr4c{YyJXp)$8J<%uys=6;$%HkjY?=?pB>y)HxYsUqWo*ILj!-ce(Sm!!#t@RJr`|} zjClDLyJ)>@GXF_mbwEn2`(T9h#!GHvKe0L^2=B!{y}R zBJ$9f3`1p3xO7xQZrc+(>#+2~R3Xn3!+&S+1)Vl$&m^>U)vpyd2O*r&2uAl_eknHL z^mK2PooK2nYG_*J#&J`_siTP<2>`c z1;sv+4zN+TXrT4eUS5)tBx}{mNx#!T3Dc=(K7K#ApLr~BSmE;$GAAG(Y2^W=Qyy3h z_$0EFif`+8_cgC=9CRY81XrgRRhBG2Iu3-wt!R) z4TlC<;%vRdO85J-7_PnaFto0?r!No8vmLxV_R*!IP6ix6pqx3nL#Y@=;~Cm7$vfNc zpN~|}72Gj*IOk9Tku;>!$yTrUaui(qSqVIKy#=6)7Vci&{tQwG6vl;Exf|RqSN&!O zR|jerK?(-((%SqMKQ;*