Skip to content

Commit 63d3c51

Browse files
authored
Enable 3d mode in DrawTool (#2218)
* In the experiment * updates * update * updates * fix MeasureTool * fix
1 parent bdfe3e2 commit 63d3c51

File tree

6 files changed

+182
-81
lines changed

6 files changed

+182
-81
lines changed

src/geometry/Geometry.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1650,9 +1650,9 @@ function getGeometryCoordinatesAlts(geometry, layerAlt, enableAltitude) {
16501650
coordinatesHasAlt(coordinates, tempAlts);
16511651
if (tempAlts.length) {
16521652
const alts = getCoordinatesAlts(coordinates, layerAlt, enableAltitude);
1653-
if (geometry.getShell && Array.isArray(alts[0])) {
1654-
return alts[0][0];
1655-
}
1653+
// if (geometry.getShell && Array.isArray(alts[0])) {
1654+
// return alts;
1655+
// }
16561656
return alts;
16571657
}
16581658
}

src/map/tool/AreaTool.js

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ const options = {
2424
'polygonFill': '#ffffff',
2525
'polygonOpacity': 0.5
2626
},
27-
'language' : 'zh-CN'
27+
'language': 'zh-CN'
2828
};
2929

3030
/**
@@ -109,11 +109,12 @@ class AreaTool extends DistanceTool {
109109
}
110110

111111
_msOnDrawVertex(param) {
112-
const prjCoord = this.getMap()._pointToPrj(param['point2d']);
113-
const vertexMarker = new Marker(param['coordinate'], {
112+
// const prjCoord = this.getMap()._pointToPrj(param['point2d']);
113+
const lastCoordinate = this._getLasttCoordinate() || param.coordinate;
114+
const vertexMarker = new Marker(lastCoordinate.copy(), {
114115
'symbol': this.options['vertexSymbol']
115116
});
116-
vertexMarker._setPrjCoordinates(prjCoord);
117+
// vertexMarker._setPrjCoordinates(prjCoord);
117118
this._measure(param['geometry']);
118119
this._lastVertex = vertexMarker;
119120
this._addVertexMarker(vertexMarker);
@@ -125,30 +126,32 @@ class AreaTool extends DistanceTool {
125126
if (param['point2d']) {
126127
prjCoord = this.getMap()._pointToPrj(param['point2d']);
127128
} else {
128-
let prjCoords = param['geometry']._getPrjCoordinates();
129+
let prjCoords = param['geometry']._getPrjCoordinates() || [];
129130
prjCoords = prjCoords.slice(0, prjCoords.length - 1);
130-
param['geometry']._setPrjCoordinates(prjCoords);
131+
// param['geometry']._setPrjCoordinates(prjCoords);
131132
prjCoord = prjCoords[prjCoords.length - 1];
132133
}
133-
if (param['geometry']._getPrjCoordinates().length < 3) {
134+
if (param['geometry'].getShell().length < 3) {
134135
this._lastMeasure = 0;
135136
this._clearMeasureLayers();
136137
return;
137138
}
138139

139140
const ms = this._measure(param['geometry']);
140-
const projection = this.getMap().getProjection();
141-
const coord = projection.unproject(prjCoord);
142-
const endLabel = new Label(ms, coord, this.options['labelOptions'])
141+
// const projection = this.getMap().getProjection();
142+
// const coord = projection.unproject(prjCoord);
143+
const lastCoordinate = this._getLasttCoordinate();
144+
const endLabel = new Label(ms, lastCoordinate.copy(), this.options['labelOptions'])
143145
.addTo(this._measureMarkerLayer);
144-
endLabel._setPrjCoordinates(prjCoord);
146+
// endLabel._setPrjCoordinates(prjCoord);
145147
let size = endLabel.getSize();
146148
if (!size) {
147149
size = new Size(10, 10);
148150
}
149-
this._addClearMarker(coord, prjCoord, size['width']);
151+
this._addClearMarker(lastCoordinate.copy(), prjCoord, size['width']);
150152
const geo = param['geometry'].copy();
151-
geo._setPrjCoordinates(param['geometry']._getPrjCoordinates());
153+
geo.setCoordinates(param.geometry.getCoordinates());
154+
// geo._setPrjCoordinates(param['geometry']._getPrjCoordinates());
152155
geo.addTo(this._measureLineLayer);
153156
this._lastMeasure = geo.getArea();
154157
}

src/map/tool/DistanceTool.js

Lines changed: 49 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -244,17 +244,20 @@ class DistanceTool extends DrawTool {
244244

245245
_msOnDrawStart(param) {
246246
const map = this.getMap();
247-
const prjCoord = map._pointToPrj(param['point2d']);
247+
// const prjCoord = map._pointToPrj(param['point2d']);
248248
const uid = UID();
249249
const layerId = 'distancetool_' + uid;
250250
const markerLayerId = 'distancetool_markers_' + uid;
251251
const zIndex = this.options.zIndex;
252+
const enableAltitude = this.options.enableAltitude;
252253
if (!map.getLayer(layerId)) {
253254
this._measureLineLayer = new VectorLayer(layerId, {
254-
zIndex
255+
zIndex,
256+
enableAltitude
255257
}).addTo(map);
256258
this._measureMarkerLayer = new VectorLayer(markerLayerId, {
257-
zIndex
259+
zIndex,
260+
enableAltitude
258261
}).addTo(map);
259262
} else {
260263
this._measureLineLayer = map.getLayer(layerId);
@@ -264,14 +267,15 @@ class DistanceTool extends DrawTool {
264267
this._measureLayers.push(this._measureMarkerLayer);
265268
this._pushLayers([this._measureLineLayer, this._measureMarkerLayer]);
266269
//start marker
267-
const marker = new Marker(param['coordinate'], {
270+
const firstCoordinate = this._getFirstCoordinate() || param.coordinate;
271+
const marker = new Marker(firstCoordinate.copy(), {
268272
'symbol': this.options['vertexSymbol']
269273
});
270274
//调用_setPrjCoordinates主要是为了解决repeatworld下,让它能标注在其他世界的问题
271-
marker._setPrjCoordinates(prjCoord);
275+
// marker._setPrjCoordinates(prjCoord);
272276
const content = this.translator.translate('distancetool.start');
273-
const startLabel = new Label(content, param['coordinate'], this.options['labelOptions']);
274-
startLabel._setPrjCoordinates(prjCoord);
277+
const startLabel = new Label(content, firstCoordinate.copy(), this.options['labelOptions']);
278+
// startLabel._setPrjCoordinates(prjCoord);
275279
this._lastVertex = startLabel;
276280
this._addVertexMarker(marker, startLabel);
277281
}
@@ -288,33 +292,37 @@ class DistanceTool extends DrawTool {
288292
this._tailLabel = new Label(ms, param['coordinate'], this.options['labelOptions'])
289293
.addTo(this._measureMarkerLayer);
290294
}
291-
const prjCoords = this._geometry._getPrjCoordinates();
292-
const lastCoord = prjCoords[prjCoords.length - 1];
293-
this._tailMarker.setCoordinates(param['coordinate']);
294-
this._tailMarker._setPrjCoordinates(lastCoord);
295+
// const prjCoords = this._geometry._getPrjCoordinates();
296+
// const lastCoord = prjCoords[prjCoords.length - 1];
297+
const lastCoordinate = this._getLasttCoordinate() || param.coordinate;
298+
this._tailMarker.setCoordinates(lastCoordinate.copy());
299+
// this._tailMarker._setPrjCoordinates(lastCoord);
295300
this._tailLabel.setContent(ms);
296-
this._tailLabel.setCoordinates(param['coordinate']);
297-
this._tailLabel._setPrjCoordinates(lastCoord);
301+
this._tailLabel.setCoordinates(lastCoordinate.copy());
302+
// this._tailLabel._setPrjCoordinates(lastCoord);
298303
}
299304

300305
_msGetCoordsToMeasure(param) {
301306
return param['geometry'].getCoordinates().concat([param['coordinate']]);
302307
}
303308

304309
_msOnDrawVertex(param) {
305-
const prjCoords = this._geometry._getPrjCoordinates();
306-
const lastCoord = prjCoords[prjCoords.length - 1];
310+
// const prjCoords = this._geometry._getPrjCoordinates();
311+
// const lastCoord = prjCoords[prjCoords.length - 1];
312+
313+
const lastCoordinate = this._getLasttCoordinate() || param.coordinate;
314+
307315
const geometry = param['geometry'];
308316
//vertex marker
309-
const marker = new Marker(param['coordinate'], {
317+
const marker = new Marker(lastCoordinate.copy(), {
310318
'symbol': this.options['vertexSymbol']
311319
});
312320

313321
const length = this._measure(geometry);
314-
const vertexLabel = new Label(length, param['coordinate'], this.options['labelOptions']);
322+
const vertexLabel = new Label(length, lastCoordinate.copy(), this.options['labelOptions']);
315323
this._addVertexMarker(marker, vertexLabel);
316-
vertexLabel._setPrjCoordinates(lastCoord);
317-
marker._setPrjCoordinates(lastCoord);
324+
// vertexLabel._setPrjCoordinates(lastCoord);
325+
// marker._setPrjCoordinates(lastCoord);
318326
this._lastVertex = vertexLabel;
319327
}
320328

@@ -334,7 +342,7 @@ class DistanceTool extends DrawTool {
334342

335343
_msOnDrawEnd(param) {
336344
this._clearTailMarker();
337-
if (param['geometry']._getPrjCoordinates().length < 2) {
345+
if (param['geometry'].getCoordinates().length < 2) {
338346
this._lastMeasure = 0;
339347
this._clearMeasureLayers();
340348
return;
@@ -345,7 +353,10 @@ class DistanceTool extends DrawTool {
345353
}
346354
this._addClearMarker(this._lastVertex.getCoordinates(), this._lastVertex._getPrjCoordinates(), size['width']);
347355
const geo = param['geometry'].copy();
348-
geo._setPrjCoordinates(param['geometry']._getPrjCoordinates());
356+
357+
geo.setCoordinates(param.geometry.getCoordinates());
358+
359+
// geo._setPrjCoordinates(param['geometry']._getPrjCoordinates());
349360
geo.addTo(this._measureLineLayer);
350361
this._lastMeasure = geo.getLength();
351362
}
@@ -380,7 +391,7 @@ class DistanceTool extends DrawTool {
380391
return false;
381392
}, this);
382393
endMarker.addTo(this._measureMarkerLayer);
383-
endMarker._setPrjCoordinates(prjCoord);
394+
// endMarker._setPrjCoordinates(prjCoord);
384395
}
385396

386397
_clearTailMarker() {
@@ -399,6 +410,22 @@ class DistanceTool extends DrawTool {
399410
this._measureMarkerLayer.remove();
400411
}
401412

413+
_getFirstCoordinate() {
414+
if (!this._geometry) {
415+
return null;
416+
}
417+
const coordinates = this._geometry.getCoordinates() || [];
418+
return coordinates[0];
419+
}
420+
421+
_getLasttCoordinate() {
422+
if (!this._geometry) {
423+
return null;
424+
}
425+
const coordinates = this._geometry.getCoordinates() || [];
426+
return coordinates[coordinates.length - 1];
427+
}
428+
402429
}
403430

404431
DistanceTool.mergeOptions(options);

src/map/tool/DrawTool.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ const options = {
3232
'autoPanAtEdge': false,
3333
'ignoreMouseleave': true,
3434
'blockGeometryEvents': false,
35-
'zIndex': Number.MAX_VALUE
35+
'zIndex': Number.MAX_VALUE,
36+
'enableAltitude': true
3637
};
3738

3839
const registeredMode = {};
@@ -364,6 +365,7 @@ class DrawTool extends MapTool {
364365
* @private
365366
*/
366367
_clickHandler(event) {
368+
event.enableAltitude = this.options.enableAltitude;
367369
const map = this.getMap();
368370
const registerMode = this._getRegisterMode();
369371
// const coordinate = event['coordinate'];
@@ -497,6 +499,7 @@ class DrawTool extends MapTool {
497499
* @private
498500
*/
499501
_mouseMoveHandler(event) {
502+
event.enableAltitude = this.options.enableAltitude;
500503
const map = this.getMap();
501504
if (!map || map.isInteracting()) {
502505
return;
@@ -556,6 +559,7 @@ class DrawTool extends MapTool {
556559
* @private
557560
*/
558561
_doubleClickHandler(event) {
562+
event.enableAltitude = this.options.enableAltitude;
559563
if (!this._geometry) {
560564
return;
561565
}

0 commit comments

Comments
 (0)