当前位置: 首页 > news >正文

ArcGisRuntime100.14绘制曲线

      有时,在地图上显示为曲线的形状实际上是一系列连接的线性段,它们近似于曲线。对于许多用例(并且取决于您对数据所需的准确性),这是表示弯曲特征的可接受方式。ArcGIS 还可以使用准确表示曲线几何的线段来存储和显示几何。EllipticArcSegment在 ArcGIS Runtime 中,曲线段由或CubicBezierSegment类的实例表示。这些线段称为 真曲线

     您可以将曲线段添加到aMultipartBuilder中,如果几何体具有曲线,则曲线段会在适用的情况下从构成多部分几何体的集合中返回。曲线和线性段可以在同一个多部分几何图形中混合在一起。

    您可以使用GeometryEngine.Densify()基于多个线性段的真实曲线创建近似曲线。这样的曲线通常被称为致密曲线。默认情况下,不会从支持曲线的服务中获取曲线几何图形,这意味着将返回真实曲线几何图形的致密版本。用于ServiceCurveGeometryMode更改此默认行为。

    OnlyAllowTrueCurveUpdatesByTrueCurveClients默认情况下,无法更新存储在服务中的曲线几何图形为 true。要更新此类几何图形,请确保您的应用在整个工作流程中正确处理几何图形中的曲线段并设置ServiceCurveGeometryMode为TrueCurveClient. 您必须在对服务进行任何调用之前执行此操作,因为在发出第一个请求后无法更改它。

效果图

 源代码

<esri:MapView  Map="{Binding Map, Source={StaticResource MapViewModel}}" GraphicsOverlays="{Binding GraphicsOverlay,Source={StaticResource MapViewModel}}"  >

/esri:MapView>
 public class MapViewModel : INotifyPropertyChanged
    {
        public MapViewModel()
        {
            _map = new Map(SpatialReferences.WebMercator); 
            GraphicsOverlay graphicsOverlay = MakeCurvedGraphicsOverlay();
            this.graphicsOverlay = new GraphicsOverlayCollection();
            this.graphicsOverlay.Add(graphicsOverlay);
        }
        private GraphicsOverlayCollection graphicsOverlay;

        public GraphicsOverlayCollection GraphicsOverlay
        {
            get { return graphicsOverlay; }
            set { graphicsOverlay = value; OnPropertyChanged(); }
        }

        private Map _map;

        /// <summary>
        /// Gets or sets the map
        /// </summary>
        public Map Map
        {
            get => _map;
            set { _map = value; OnPropertyChanged(); }
        }

        /// <summary>
        /// Raises the <see cref="MapViewModel.PropertyChanged" /> event
        /// </summary>
        /// <param name="propertyName">The name of the property that has changed</param>
        protected void OnPropertyChanged([CallerMemberName] string propertyName = null) =>
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

        public event PropertyChangedEventHandler PropertyChanged;
        private GraphicsOverlay MakeCurvedGraphicsOverlay()
        {
            // Create a simple fill symbol with outline.
            SimpleLineSymbol curvedLineSymbol = new SimpleLineSymbol(SimpleLineSymbolStyle.Solid, Color.Black, 1);
            SimpleFillSymbol curvedFillSymbol = new SimpleFillSymbol(SimpleFillSymbolStyle.Solid, Color.Red, curvedLineSymbol);

            // Create a graphics overlay for the polygons with curve segments.
            GraphicsOverlay curvedGraphicsOverlay = new GraphicsOverlay();

            // Create and assign a simple renderer to the graphics overlay.
            curvedGraphicsOverlay.Renderer = new SimpleRenderer(curvedFillSymbol);

            // Create a heart-shaped graphic.
            MapPoint origin = new MapPoint(x: 40e5, y: 5e5, SpatialReferences.WebMercator);
            Geometry heartGeometry = MakeHeartGeometry(origin, 10e5);

            Graphic heartGraphic = new Graphic(heartGeometry);
            curvedGraphicsOverlay.Graphics.Add(heartGraphic);
            return curvedGraphicsOverlay;
        }
        private Geometry MakeHeartGeometry(MapPoint center, double sideLength)
        {
            if (sideLength <= 0) return null;

            SpatialReference spatialReference = center.SpatialReference;

            // The x and y coordinates to simplify the calculation.
            double minX = center.X - 0.5 * sideLength;
            double minY = center.Y - 0.5 * sideLength;

            // The radius of the arcs.
            double arcRadius = sideLength * 0.25;

            // Bottom left curve.
            MapPoint leftCurveStart = new MapPoint(center.X, minY, spatialReference);
            MapPoint leftCurveEnd = new MapPoint(minX, minY + 0.75 * sideLength, spatialReference);
            MapPoint leftControlMapPoint1 = new MapPoint(center.X, minY + 0.25 * sideLength, spatialReference);
            MapPoint leftControlMapPoint2 = new MapPoint(minX, center.Y, spatialReference: spatialReference);
            CubicBezierSegment leftCurve = new CubicBezierSegment(leftCurveStart, leftControlMapPoint1, leftControlMapPoint2, leftCurveEnd, spatialReference);

            // Top left arc.
            MapPoint leftArcCenter = new MapPoint(minX + 0.25 * sideLength, minY + 0.75 * sideLength, spatialReference);
            EllipticArcSegment leftArc = EllipticArcSegment.CreateCircularEllipticArc(leftArcCenter, arcRadius, Math.PI, centralAngle: -Math.PI, spatialReference);

            // Top right arc.
            MapPoint rightArcCenter = new MapPoint(minX + 0.75 * sideLength, minY + 0.75 * sideLength, spatialReference);
            EllipticArcSegment rightArc = EllipticArcSegment.CreateCircularEllipticArc(rightArcCenter, arcRadius, Math.PI, centralAngle: -Math.PI, spatialReference);

            // Bottom right curve.
            MapPoint rightCurveStart = new MapPoint(minX + sideLength, minY + 0.75 * sideLength, spatialReference);
            MapPoint rightCurveEnd = leftCurveStart;
            MapPoint rightControlMapPoint1 = new MapPoint(minX + sideLength, center.Y, spatialReference);
            MapPoint rightControlMapPoint2 = leftControlMapPoint1;
            CubicBezierSegment rightCurve = new CubicBezierSegment(rightCurveStart, rightControlMapPoint1, rightControlMapPoint2, rightCurveEnd, spatialReference);

            // Create the heart polygon.
            Part newPart = new Part(new Segment[]
            {
                leftCurve,
                leftArc,
                rightArc,
                rightCurve
            }, spatialReference);
            PolygonBuilder builder = new PolygonBuilder(spatialReference);
            builder.AddPart(newPart);
            return builder.ToGeometry();
        }
    }

相关文章:

  • 榜一的蔑视!阿里专家手写Spring全家桶笔记,整2000页
  • 置业小技能:按揭相关事项
  • 存储更弹性,详解 Fluid “ECI 环境数据访问” 新功能
  • 高精度随流检测技术助力金融行业实现智能运维
  • windows上Qt5.15+openssl1.1.1+msvs2022静态编译32位版本的笔记
  • CentOS系统下,配制nginx访问favicon.ico
  • 1-十四烷基-3-甲基咪唑六氟磷酸盐([C14MIm][PF6])修饰纳米SiO2二氧化硅(mg级瓶装)
  • stm32f4xx-定时器
  • (过滤器)Filter和(监听器)listener
  • Java 并发编程解析 | 如何正确理解Java领域中的锁机制,我们一般需要掌握哪些理论知识?
  • Vue项目流程7,交易页面,提交订单,支付页面,利用element UI 以及 QRCode 完成微信支付,弹出框按钮的相关工作,个人中心以及子路由我的订单
  • 在Java中使用SFTP传输文件
  • OC5860降压芯片,MPS2459脚位一样,节省肖特基规格书
  • 哈工大李治军老师操作系统笔记【4】:系统调用的实现(Learning OS Concepts By Coding Them !)
  • 【光学】基于matlab色散曲线拟合【含Matlab源码 2053期】
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • Java 内存分配及垃圾回收机制初探
  • JavaScript对象详解
  • Java多线程(4):使用线程池执行定时任务
  • php面试题 汇集2
  • Terraform入门 - 3. 变更基础设施
  • Vue.js源码(2):初探List Rendering
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 复杂数据处理
  • 规范化安全开发 KOA 手脚架
  • 删除表内多余的重复数据
  • 微信公众号开发小记——5.python微信红包
  • 协程
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 容器镜像
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #define与typedef区别
  • #控制台大学课堂点名问题_课堂随机点名
  • #每日一题合集#牛客JZ23-JZ33
  • (003)SlickEdit Unity的补全
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (bean配置类的注解开发)学习Spring的第十三天
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (done) 两个矩阵 “相似” 是什么意思?
  • (Oracle)SQL优化技巧(一):分页查询
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • *2 echo、printf、mkdir命令的应用
  • .aanva
  • .CSS-hover 的解释
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET Framework 服务实现监控可观测性最佳实践
  • .net流程开发平台的一些难点(1)
  • .NET运行机制
  • .net知识和学习方法系列(二十一)CLR-枚举
  • [20161214]如何确定dbid.txt
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作
  • [ARM]ldr 和 adr 伪指令的区别
  • [C#] 基于 yield 语句的迭代器逻辑懒执行
  • [C++ 从入门到精通] 12.重载运算符、赋值运算符重载、析构函数