Skip to content

Commit da78956

Browse files
authored
fix linestring/polygon has altitude clip error fix #1168 (#1406)
* fix linestring/polygon has altitude clip error fix #1168 * add geometry has altitude clip ci test
1 parent 2f608ff commit da78956

File tree

2 files changed

+110
-70
lines changed

2 files changed

+110
-70
lines changed

src/renderer/geometry/Painter.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,28 @@ class Painter extends Class {
329329
}
330330

331331
_clip(points, altitude) {
332+
// linestring polygon clip
333+
if (isNumber(altitude) && altitude !== 0) {
334+
return {
335+
points,
336+
altitude
337+
};
338+
}
339+
if (Array.isArray(altitude)) {
340+
let hasAltitude = false;
341+
for (let i = 0, len = altitude.length; i < len; i++) {
342+
if (altitude[i] !== 0) {
343+
hasAltitude = true;
344+
break;
345+
}
346+
}
347+
if (hasAltitude) {
348+
return {
349+
points,
350+
altitude
351+
};
352+
}
353+
}
332354
const map = this.getMap(),
333355
geometry = this.geometry;
334356
let lineWidth = this.getSymbol()['lineWidth'];

test/geometry/GeometryAltitudeSpec.js

Lines changed: 88 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@ describe('Geometry.Altitude', function () {
66

77
beforeEach(function () {
88
var setups = COMMON_CREATE_MAP(center, null, {
9-
width : 800,
10-
height : 600
9+
width: 800,
10+
height: 600
1111
});
1212
container = setups.container;
1313
map = setups.map;
1414
map.config('centerCross', true);
15-
layer = new maptalks.VectorLayer('id', { 'enableAltitude' : true });
15+
layer = new maptalks.VectorLayer('id', { 'enableAltitude': true });
1616
});
1717

1818
afterEach(function () {
@@ -23,9 +23,9 @@ describe('Geometry.Altitude', function () {
2323
describe('render geometry with altitude', function () {
2424
it('circle', function (done) {
2525
var circle = new maptalks.Circle(map.getCenter(), 2, {
26-
properties : { altitude : 200 },
27-
symbol : {
28-
'polygonFill' : '#f00'
26+
properties: { altitude: 200 },
27+
symbol: {
28+
'polygonFill': '#f00'
2929
}
3030
});
3131
layer.addGeometry(circle);
@@ -40,11 +40,11 @@ describe('Geometry.Altitude', function () {
4040

4141
it('marker', function (done) {
4242
var marker = new maptalks.Marker(map.getCenter(), {
43-
properties : { altitude : 100 },
44-
symbol : {
45-
'markerType' : 'ellipse',
46-
'markeraltitude' : 6,
47-
'markerWidth' : 6
43+
properties: { altitude: 100 },
44+
symbol: {
45+
'markerType': 'ellipse',
46+
'markeraltitude': 6,
47+
'markerWidth': 6
4848
}
4949
});
5050
layer.addGeometry(marker);
@@ -63,14 +63,14 @@ describe('Geometry.Altitude', function () {
6363
map.setPitch(60);
6464
var center = map.getCenter();
6565
layer.config('drawAltitude', {
66-
lineWidth : 5,
67-
lineColor : '#000',
68-
polygonFill : '#000'
66+
lineWidth: 5,
67+
lineColor: '#000',
68+
polygonFill: '#000'
6969
});
7070
var line = new maptalks.LineString([center.sub(0.001, 0), center.add(0.001, 0)], {
71-
properties : { altitude : 20 },
72-
symbol : {
73-
'polygonFill' : '#f00'
71+
properties: { altitude: 20 },
72+
symbol: {
73+
'polygonFill': '#f00'
7474
}
7575
});
7676
layer.addGeometry(line);
@@ -87,14 +87,14 @@ describe('Geometry.Altitude', function () {
8787
map.setBearing(60);
8888
var center = map.getCenter();
8989
layer.config('drawAltitude', {
90-
lineWidth : 5,
91-
lineColor : '#000',
92-
polygonFill : '#000'
90+
lineWidth: 5,
91+
lineColor: '#000',
92+
polygonFill: '#000'
9393
});
9494
var line = new maptalks.LineString([center.sub(0.001, 0), center.add(0.001, 0)], {
95-
properties : { altitude : [40, 20] },
96-
symbol : {
97-
'polygonFill' : '#f00'
95+
properties: { altitude: [40, 20] },
96+
symbol: {
97+
'polygonFill': '#f00'
9898
}
9999
});
100100
layer.addGeometry(line);
@@ -110,17 +110,17 @@ describe('Geometry.Altitude', function () {
110110
it('draw linestring with altitude array in large zoom', function (done) {
111111
map.setPitch(60);
112112
map.setBearing(60);
113-
map.setZoom(19, { animation : false });
113+
map.setZoom(19, { animation: false });
114114
var center = map.getCenter();
115115
layer.config('drawAltitude', {
116-
lineWidth : 5,
117-
lineColor : '#000',
118-
polygonFill : '#000'
116+
lineWidth: 5,
117+
lineColor: '#000',
118+
polygonFill: '#000'
119119
});
120120
var line = new maptalks.LineString([center.sub(0.001, 0), center.add(0.001, 0), center.add(0.001, -0.001)], {
121-
properties : { altitude : [200, 100, 300] },
122-
symbol : {
123-
'polygonFill' : '#f00'
121+
properties: { altitude: [200, 100, 300] },
122+
symbol: {
123+
'polygonFill': '#f00'
124124
}
125125
});
126126
layer.addGeometry(line);
@@ -139,17 +139,17 @@ describe('Geometry.Altitude', function () {
139139
map.config('centerCross', true);
140140
var center = map.getCenter();
141141
layer.config('drawAltitude', {
142-
lineWidth : 5,
143-
lineColor : '#000',
144-
polygonFill : '#000'
142+
lineWidth: 5,
143+
lineColor: '#000',
144+
polygonFill: '#000'
145145
});
146146
var line = new maptalks.LineString([center, center.add(0.001, 0)], {
147-
properties : { altitude : [0, 40] },
148-
symbol : {
149-
'polygonFill' : '#f00',
150-
'textName' : '■■■■■■■■■',
151-
'textFill' : '#f00',
152-
'textPlacement' : 'vertex'
147+
properties: { altitude: [0, 40] },
148+
symbol: {
149+
'polygonFill': '#f00',
150+
'textName': '■■■■■■■■■',
151+
'textFill': '#f00',
152+
'textPlacement': 'vertex'
153153
}
154154
});
155155
layer.addGeometry(line);
@@ -167,12 +167,12 @@ describe('Geometry.Altitude', function () {
167167
map.config('centerCross', true);
168168
var center = map.getCenter();
169169
var line = new maptalks.LineString([center, center.add(0.001, 0)], {
170-
properties : { altitude : [0, 40] },
171-
symbol : {
172-
'polygonFill' : '#f00',
173-
'textName' : '■■■■■■■■■',
174-
'textPlacement' : 'vertex-first',
175-
'textFill' : '#f00'
170+
properties: { altitude: [0, 40] },
171+
symbol: {
172+
'polygonFill': '#f00',
173+
'textName': '■■■■■■■■■',
174+
'textPlacement': 'vertex-first',
175+
'textFill': '#f00'
176176
}
177177
});
178178
layer.addGeometry(line);
@@ -188,12 +188,12 @@ describe('Geometry.Altitude', function () {
188188
map.config('centerCross', true);
189189
var center = map.getCenter();
190190
var line = new maptalks.LineString([center, center.add(0.001, 0)], {
191-
properties : { altitude : [0, 40] },
192-
symbol : {
193-
'polygonFill' : '#f00',
194-
'textName' : '■■■■■■■■■',
195-
'textPlacement' : 'line',
196-
'textFill' : '#f00'
191+
properties: { altitude: [0, 40] },
192+
symbol: {
193+
'polygonFill': '#f00',
194+
'textName': '■■■■■■■■■',
195+
'textPlacement': 'line',
196+
'textFill': '#f00'
197197
}
198198
});
199199
layer.addGeometry(line);
@@ -209,12 +209,12 @@ describe('Geometry.Altitude', function () {
209209
map.config('centerCross', true);
210210
var center = map.getCenter();
211211
var line = new maptalks.LineString([center, center.add(0.001, 0)], {
212-
properties : { altitude : [0, 40] },
213-
symbol : {
214-
'polygonFill' : '#f00',
215-
'textName' : '■■■■■■■■■',
216-
'textPlacement' : 'vertex-last',
217-
'textFill' : '#f00'
212+
properties: { altitude: [0, 40] },
213+
symbol: {
214+
'polygonFill': '#f00',
215+
'textName': '■■■■■■■■■',
216+
'textPlacement': 'vertex-last',
217+
'textFill': '#f00'
218218
}
219219
});
220220
layer.addGeometry(line);
@@ -229,16 +229,16 @@ describe('Geometry.Altitude', function () {
229229

230230
it('draw altitude of marker', function (done) {
231231
var marker = new maptalks.Marker(map.getCenter(), {
232-
properties : { altitude : 100 },
233-
symbol : {
234-
'markerType' : 'ellipse',
235-
'markeraltitude' : 6,
236-
'markerWidth' : 6
232+
properties: { altitude: 100 },
233+
symbol: {
234+
'markerType': 'ellipse',
235+
'markeraltitude': 6,
236+
'markerWidth': 6
237237
}
238238
});
239239
layer.config('drawAltitude', {
240-
lineWidth : 5,
241-
lineColor : '#000'
240+
lineWidth: 5,
241+
lineColor: '#000'
242242
});
243243
layer.addGeometry(marker);
244244
map.setPitch(60);
@@ -253,15 +253,15 @@ describe('Geometry.Altitude', function () {
253253
it('draw altitude of marker without altitude prop', function (done) {
254254
var marker = new maptalks.Marker(map.getCenter(), {
255255
// properties : { altitude : 100 },
256-
symbol : {
257-
'markerType' : 'ellipse',
258-
'markeraltitude' : 6,
259-
'markerWidth' : 6
256+
symbol: {
257+
'markerType': 'ellipse',
258+
'markeraltitude': 6,
259+
'markerWidth': 6
260260
}
261261
});
262262
layer.config('drawAltitude', {
263-
lineWidth : 5,
264-
lineColor : '#000'
263+
lineWidth: 5,
264+
lineColor: '#000'
265265
});
266266
layer.addGeometry(marker);
267267
map.setPitch(60);
@@ -273,4 +273,22 @@ describe('Geometry.Altitude', function () {
273273
map.addLayer(layer);
274274
});
275275
});
276+
277+
describe('geometry has altitude clip', function () {
278+
it('circle', function (done) {
279+
var circle = new maptalks.Circle(map.getCenter().add(0, -0.005), 300, {
280+
properties: { altitude: 200 },
281+
symbol: {
282+
'polygonFill': '#f00'
283+
}
284+
});
285+
layer.addGeometry(circle);
286+
map.setPitch(60);
287+
layer.once('layerload', function () {
288+
expect(layer).to.be.painted(0, map.getSize().height / 2 - 1);
289+
done();
290+
});
291+
map.addLayer(layer);
292+
});
293+
});
276294
});

0 commit comments

Comments
 (0)