微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何获取 ArcGIS TextSymbol 的边界矩形?

如何解决如何获取 ArcGIS TextSymbol 的边界矩形?

我使用的是 Qt C++ ArcGIS Runtime SDK v100.9,我在地图上绘制了各种形状和标签

我希望能够在地图上的给定点 (SpatialReference::wgs84) 上找出 Graphic(这是一个文本标签 (TextSymbol))的区域(边界矩形),以便我可以确定标签多于或少于另一个 Graphic(假设它有一个用于绘制圆的几何图形的多边形),以决定是否应将标签设置为可见。

在派生自 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);

与其总是将标签可见性设置为 true,我认为我可以获取每个图形的几何图形并使用它来构建一个信封,然后我可以得到每个信封的宽度,然后可以进行比较:

    Envelope circleEnvelope(circleGraphic_p->geometry());
    Envelope labelEnvelope(labelGraphic_p->geometry());

    labelGraphic_p->setVisible(circleEnvelope.width() >= labelEnvelope.width());

但是当我尝试这样做时,每个信封的宽度总是一个非常小的负值(例如 -2.25017...e-98)

关于我做错了什么的任何建议,或者是否有更好的方法获取文本标签和由折线或多边形的几何描述的图形在地图(或设备独立单位)上的大小?

编辑:我发现 Geometry 对象有一个 extent() 方法,我可以从中获取圆的宽度,但 GeometryGraphic 是用于文本标签的结果是其 extent() 方法的宽度为零。我希望这是因为 Geometry 只是一个没有宽度或高度的 Point。那么问题仍然是如何获得 TextSymbol 的边界矩形?

解决方法

您是对的,范围是底层几何体的返回值,而不是 TextSymbol。我不认为您将能够以自己的方式实现您想要的东西,因为没有办法获得符号本身的边界框或屏幕坐标。相反,您是否考虑过使用 LabelDefinitions 并设置各种去冲突选项? This sample 在图层上显示标签,但也可以应用于图形。您可以应用许多 labeling options,这将允许内部标签引擎为您解决冲突。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。