效果如下
电子海图基本操作
关键代码
直线:
void HaiTu::create_line(const Point* currentpos )
{
if (linegraphic) {
lineoverlay->graphics()->removeOne(linegraphic);
delete linegraphic;
}
if (line) {
lineoverlay->graphics()->removeOne(line);
delete line;
}
if (linepoints.size() >= 1) {
PolylineBuilder polylineBuilder(SpatialReference::wgs84());
for (const Point& point : linepoints) {
polylineBuilder.addPoint(point);
}
SimpleLineSymbol* mainSymbol = new SimpleLineSymbol(
SimpleLineSymbolStyle::Solid,
QColor(65, 105, 225),
4.0
);
linegraphic = new Graphic(polylineBuilder.toGeometry(), mainSymbol);
lineoverlay->graphics()->append(linegraphic);
if (currentpos && !linepoints.isEmpty()) {
PolylineBuilder previewBuilder(SpatialReference::wgs84());
previewBuilder.addPoint(linepoints.last());
previewBuilder.addPoint(*currentpos);
SimpleLineSymbol* previewSymbol = new SimpleLineSymbol(
SimpleLineSymbolStyle::Dash,
QColor(220, 20, 60), // 猩红色
3.0
);
line = new Graphic(previewBuilder.toGeometry(), previewSymbol);
lineoverlay->graphics()->append(line);
}
}
}
圆:
void HaiTu::create_circle(double centerlongitude, double centerlatitude, double radius)
{
Point centerPoint(centerlongitude, centerlatitude, SpatialReference::wgs84());
double stretchFactor = 1 / qCos(qDegreesToRadians(centerlatitude));
Point centerWebMercator = GeometryEngine::project(centerPoint, SpatialReference::webMercator());
Geometry circleGeometry = GeometryEngine::buffer(centerWebMercator, radius * stretchFactor);
SimpleFillSymbol* fillSymbol = new SimpleFillSymbol(
SimpleFillSymbolStyle::Solid,
QColor(255, 0, 0, 100),
new SimpleLineSymbol(SimpleLineSymbolStyle::Solid, QColor(0, 0, 255), 2.0)
);
if (circlegraphic) {
circleoverlay->graphics()->removeOne(circlegraphic);
delete circlegraphic;
}
circlegraphic = new Graphic(circleGeometry, fillSymbol);
circleoverlay->graphics()->append(circlegraphic);
}
多边形:
void HaiTu::create_polygon(const Point* currentpos )
{
if (polygongraphic) {
polygonoverlay->graphics()->removeOne(polygongraphic);
delete polygongraphic;
polygongraphic = nullptr;
}
if (polygonline) {
polygonoverlay->graphics()->removeOne(polygonline);
delete polygonline;
polygonline = nullptr;
}
if (polygonpoints.size() >= 2) {
PolygonBuilder polygonBuilder(SpatialReference::wgs84());
for (const Point& p : polygonpoints) {
polygonBuilder.addPoint(p);
}
if (currentpos) {
polygonBuilder.addPoint(*currentpos);
}
if (polygonpoints.size() >= 3 || !currentpos) {
polygonBuilder.addPoint(polygonpoints.first());
}
SimpleFillSymbol* fillSymbol = new SimpleFillSymbol(
SimpleFillSymbolStyle::Solid,
QColor(70, 130, 180, 90),
new SimpleLineSymbol(SimpleLineSymbolStyle::Solid, QColor(25, 25, 112), 2.5)
);
polygongraphic = new Graphic(polygonBuilder.toGeometry(), fillSymbol);
polygonoverlay->graphics()->append(polygongraphic);
if (currentpos && !polygonpoints.isEmpty()) {
PolylineBuilder lineBuilder(SpatialReference::wgs84());
lineBuilder.addPoint(polygonpoints.last());
lineBuilder.addPoint(*currentpos);
SimpleLineSymbol* lineSymbol = new SimpleLineSymbol(
SimpleLineSymbolStyle::DashDot,
QColor(220, 20, 60),
2.0
);
polygonline = new Graphic(lineBuilder.toGeometry(), lineSymbol);
polygonoverlay->graphics()->append(polygonline);
}
}
}
基于ArcGIS与Qt实现电子海图操作
572

被折叠的 条评论
为什么被折叠?



