Skip to content

Commit

Permalink
Enable 3d mode in DrawTool (#2218)
Browse files Browse the repository at this point in the history
* In the experiment

* updates

* update

* updates

* fix MeasureTool

* fix
  • Loading branch information
deyihu authored Mar 14, 2024
1 parent bdfe3e2 commit 63d3c51
Show file tree
Hide file tree
Showing 6 changed files with 182 additions and 81 deletions.
6 changes: 3 additions & 3 deletions src/geometry/Geometry.js
Original file line number Diff line number Diff line change
Expand Up @@ -1650,9 +1650,9 @@ function getGeometryCoordinatesAlts(geometry, layerAlt, enableAltitude) {
coordinatesHasAlt(coordinates, tempAlts);
if (tempAlts.length) {
const alts = getCoordinatesAlts(coordinates, layerAlt, enableAltitude);
if (geometry.getShell && Array.isArray(alts[0])) {
return alts[0][0];
}
// if (geometry.getShell && Array.isArray(alts[0])) {
// return alts;
// }
return alts;
}
}
Expand Down
29 changes: 16 additions & 13 deletions src/map/tool/AreaTool.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ const options = {
'polygonFill': '#ffffff',
'polygonOpacity': 0.5
},
'language' : 'zh-CN'
'language': 'zh-CN'
};

/**
Expand Down Expand Up @@ -109,11 +109,12 @@ class AreaTool extends DistanceTool {
}

_msOnDrawVertex(param) {
const prjCoord = this.getMap()._pointToPrj(param['point2d']);
const vertexMarker = new Marker(param['coordinate'], {
// const prjCoord = this.getMap()._pointToPrj(param['point2d']);
const lastCoordinate = this._getLasttCoordinate() || param.coordinate;
const vertexMarker = new Marker(lastCoordinate.copy(), {
'symbol': this.options['vertexSymbol']
});
vertexMarker._setPrjCoordinates(prjCoord);
// vertexMarker._setPrjCoordinates(prjCoord);
this._measure(param['geometry']);
this._lastVertex = vertexMarker;
this._addVertexMarker(vertexMarker);
Expand All @@ -125,30 +126,32 @@ class AreaTool extends DistanceTool {
if (param['point2d']) {
prjCoord = this.getMap()._pointToPrj(param['point2d']);
} else {
let prjCoords = param['geometry']._getPrjCoordinates();
let prjCoords = param['geometry']._getPrjCoordinates() || [];
prjCoords = prjCoords.slice(0, prjCoords.length - 1);
param['geometry']._setPrjCoordinates(prjCoords);
// param['geometry']._setPrjCoordinates(prjCoords);
prjCoord = prjCoords[prjCoords.length - 1];
}
if (param['geometry']._getPrjCoordinates().length < 3) {
if (param['geometry'].getShell().length < 3) {
this._lastMeasure = 0;
this._clearMeasureLayers();
return;
}

const ms = this._measure(param['geometry']);
const projection = this.getMap().getProjection();
const coord = projection.unproject(prjCoord);
const endLabel = new Label(ms, coord, this.options['labelOptions'])
// const projection = this.getMap().getProjection();
// const coord = projection.unproject(prjCoord);
const lastCoordinate = this._getLasttCoordinate();
const endLabel = new Label(ms, lastCoordinate.copy(), this.options['labelOptions'])
.addTo(this._measureMarkerLayer);
endLabel._setPrjCoordinates(prjCoord);
// endLabel._setPrjCoordinates(prjCoord);
let size = endLabel.getSize();
if (!size) {
size = new Size(10, 10);
}
this._addClearMarker(coord, prjCoord, size['width']);
this._addClearMarker(lastCoordinate.copy(), prjCoord, size['width']);
const geo = param['geometry'].copy();
geo._setPrjCoordinates(param['geometry']._getPrjCoordinates());
geo.setCoordinates(param.geometry.getCoordinates());
// geo._setPrjCoordinates(param['geometry']._getPrjCoordinates());
geo.addTo(this._measureLineLayer);
this._lastMeasure = geo.getArea();
}
Expand Down
71 changes: 49 additions & 22 deletions src/map/tool/DistanceTool.js
Original file line number Diff line number Diff line change
Expand Up @@ -244,17 +244,20 @@ class DistanceTool extends DrawTool {

_msOnDrawStart(param) {
const map = this.getMap();
const prjCoord = map._pointToPrj(param['point2d']);
// const prjCoord = map._pointToPrj(param['point2d']);
const uid = UID();
const layerId = 'distancetool_' + uid;
const markerLayerId = 'distancetool_markers_' + uid;
const zIndex = this.options.zIndex;
const enableAltitude = this.options.enableAltitude;
if (!map.getLayer(layerId)) {
this._measureLineLayer = new VectorLayer(layerId, {
zIndex
zIndex,
enableAltitude
}).addTo(map);
this._measureMarkerLayer = new VectorLayer(markerLayerId, {
zIndex
zIndex,
enableAltitude
}).addTo(map);
} else {
this._measureLineLayer = map.getLayer(layerId);
Expand All @@ -264,14 +267,15 @@ class DistanceTool extends DrawTool {
this._measureLayers.push(this._measureMarkerLayer);
this._pushLayers([this._measureLineLayer, this._measureMarkerLayer]);
//start marker
const marker = new Marker(param['coordinate'], {
const firstCoordinate = this._getFirstCoordinate() || param.coordinate;
const marker = new Marker(firstCoordinate.copy(), {
'symbol': this.options['vertexSymbol']
});
//调用_setPrjCoordinates主要是为了解决repeatworld下,让它能标注在其他世界的问题
marker._setPrjCoordinates(prjCoord);
// marker._setPrjCoordinates(prjCoord);
const content = this.translator.translate('distancetool.start');
const startLabel = new Label(content, param['coordinate'], this.options['labelOptions']);
startLabel._setPrjCoordinates(prjCoord);
const startLabel = new Label(content, firstCoordinate.copy(), this.options['labelOptions']);
// startLabel._setPrjCoordinates(prjCoord);
this._lastVertex = startLabel;
this._addVertexMarker(marker, startLabel);
}
Expand All @@ -288,33 +292,37 @@ class DistanceTool extends DrawTool {
this._tailLabel = new Label(ms, param['coordinate'], this.options['labelOptions'])
.addTo(this._measureMarkerLayer);
}
const prjCoords = this._geometry._getPrjCoordinates();
const lastCoord = prjCoords[prjCoords.length - 1];
this._tailMarker.setCoordinates(param['coordinate']);
this._tailMarker._setPrjCoordinates(lastCoord);
// const prjCoords = this._geometry._getPrjCoordinates();
// const lastCoord = prjCoords[prjCoords.length - 1];
const lastCoordinate = this._getLasttCoordinate() || param.coordinate;
this._tailMarker.setCoordinates(lastCoordinate.copy());
// this._tailMarker._setPrjCoordinates(lastCoord);
this._tailLabel.setContent(ms);
this._tailLabel.setCoordinates(param['coordinate']);
this._tailLabel._setPrjCoordinates(lastCoord);
this._tailLabel.setCoordinates(lastCoordinate.copy());
// this._tailLabel._setPrjCoordinates(lastCoord);
}

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

_msOnDrawVertex(param) {
const prjCoords = this._geometry._getPrjCoordinates();
const lastCoord = prjCoords[prjCoords.length - 1];
// const prjCoords = this._geometry._getPrjCoordinates();
// const lastCoord = prjCoords[prjCoords.length - 1];

const lastCoordinate = this._getLasttCoordinate() || param.coordinate;

const geometry = param['geometry'];
//vertex marker
const marker = new Marker(param['coordinate'], {
const marker = new Marker(lastCoordinate.copy(), {
'symbol': this.options['vertexSymbol']
});

const length = this._measure(geometry);
const vertexLabel = new Label(length, param['coordinate'], this.options['labelOptions']);
const vertexLabel = new Label(length, lastCoordinate.copy(), this.options['labelOptions']);
this._addVertexMarker(marker, vertexLabel);
vertexLabel._setPrjCoordinates(lastCoord);
marker._setPrjCoordinates(lastCoord);
// vertexLabel._setPrjCoordinates(lastCoord);
// marker._setPrjCoordinates(lastCoord);
this._lastVertex = vertexLabel;
}

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

_msOnDrawEnd(param) {
this._clearTailMarker();
if (param['geometry']._getPrjCoordinates().length < 2) {
if (param['geometry'].getCoordinates().length < 2) {
this._lastMeasure = 0;
this._clearMeasureLayers();
return;
Expand All @@ -345,7 +353,10 @@ class DistanceTool extends DrawTool {
}
this._addClearMarker(this._lastVertex.getCoordinates(), this._lastVertex._getPrjCoordinates(), size['width']);
const geo = param['geometry'].copy();
geo._setPrjCoordinates(param['geometry']._getPrjCoordinates());

geo.setCoordinates(param.geometry.getCoordinates());

// geo._setPrjCoordinates(param['geometry']._getPrjCoordinates());
geo.addTo(this._measureLineLayer);
this._lastMeasure = geo.getLength();
}
Expand Down Expand Up @@ -380,7 +391,7 @@ class DistanceTool extends DrawTool {
return false;
}, this);
endMarker.addTo(this._measureMarkerLayer);
endMarker._setPrjCoordinates(prjCoord);
// endMarker._setPrjCoordinates(prjCoord);
}

_clearTailMarker() {
Expand All @@ -399,6 +410,22 @@ class DistanceTool extends DrawTool {
this._measureMarkerLayer.remove();
}

_getFirstCoordinate() {
if (!this._geometry) {
return null;
}
const coordinates = this._geometry.getCoordinates() || [];
return coordinates[0];
}

_getLasttCoordinate() {
if (!this._geometry) {
return null;
}
const coordinates = this._geometry.getCoordinates() || [];
return coordinates[coordinates.length - 1];
}

}

DistanceTool.mergeOptions(options);
Expand Down
6 changes: 5 additions & 1 deletion src/map/tool/DrawTool.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ const options = {
'autoPanAtEdge': false,
'ignoreMouseleave': true,
'blockGeometryEvents': false,
'zIndex': Number.MAX_VALUE
'zIndex': Number.MAX_VALUE,
'enableAltitude': true
};

const registeredMode = {};
Expand Down Expand Up @@ -364,6 +365,7 @@ class DrawTool extends MapTool {
* @private
*/
_clickHandler(event) {
event.enableAltitude = this.options.enableAltitude;
const map = this.getMap();
const registerMode = this._getRegisterMode();
// const coordinate = event['coordinate'];
Expand Down Expand Up @@ -497,6 +499,7 @@ class DrawTool extends MapTool {
* @private
*/
_mouseMoveHandler(event) {
event.enableAltitude = this.options.enableAltitude;
const map = this.getMap();
if (!map || map.isInteracting()) {
return;
Expand Down Expand Up @@ -556,6 +559,7 @@ class DrawTool extends MapTool {
* @private
*/
_doubleClickHandler(event) {
event.enableAltitude = this.options.enableAltitude;
if (!this._geometry) {
return;
}
Expand Down
Loading

0 comments on commit 63d3c51

Please sign in to comment.