【发布时间】:2021-01-19 13:20:18
【问题描述】:
我正在使用 Qt C++ ArcGIS Runtime SDK v100.9,我在地图上绘制了各种形状和标签。
我希望能够找出 Graphic(地图上给定点 (SpatialReference::wgs84) 处的文本标签 (TextSymbol))的区域(边界矩形),以便确定标签大于或小于另一个图形(假设它的几何图形有一个多边形,用于绘制一个圆圈),以确定标签是否应设置为可见。
在派生自 Esri::ArcGISRuntime::MapGraphicsView 的类中,圆和文本标签是沿以下行创建的:
Point centerWgs84(0.0, 0.0, SpatialReference::wgs84());
Graphic* circleGraphic_p = new Graphic(GeometryEngine::bufferGeodetic(centerWgs84, 1000.0, LinearUnit::meters(), 0.5, GeodeticCurveType::Geodesic));
this->graphicsOverlays()->at(0)->graphics()->append(circleGraphic_p);
circleGraphic_p->setSymbol(new SimpleLineSymbol(SimpleLineSymbolStyle::Solid, QColor(Qt::blue), 1.0));
circleGraphic_p->setVisible(true);
TextSymbol* textMarker_p = new TextSymbol("Some Label", Qt::black, 12.0, HorizontalAlignment::Center, VerticalAlignment::Bottom);
Graphic* labelGraphic_p = new Graphic(centerWgs84, textMarker_p);
this->graphicsOverlays()->at(0)->graphics()->append(labelGraphic_p);
labelGraphic_p->setVisible(true);
我认为我可以获取每个图形的几何图形并使用它来构造一个信封,而不是总是将标签可见性设置为真,这样我就可以得到每个信封的宽度,然后可以进行比较:
Envelope circleEnvelope(circleGraphic_p->geometry());
Envelope labelEnvelope(labelGraphic_p->geometry());
labelGraphic_p->setVisible(circleEnvelope.width() >= labelEnvelope.width());
但是当我尝试这样做时,每个信封的宽度总是一个非常小的负值(例如-2.25017...e-98)
关于我做错了什么或者是否有更好的方法来获取文本标签的地图(或与设备无关的单位)的大小以及由折线或多边形的几何图形描述的图形的任何建议?
编辑:我发现Geometry 对象有一个extent() 方法,我可以从中获取圆的宽度,但用于文本标签的Graphic 的Geometry 会导致extent() 方法的宽度为零。我希望这是因为Geometry 只是一个没有宽度或高度的Point。所以问题仍然是如何获得 TextSymbol 的边界矩形?
【问题讨论】:
标签: c++ qt arcgis arcgis-runtime