基于arcgis runtime sdk for qt 实现电子海图的基本操作

基于ArcGIS与Qt实现电子海图操作

基于arcgis runtime sdk for qt 实现电子海图的基本操作

效果如下

电子海图基本操作

关键代码

直线:

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);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值