ArcGIS地图中圆形区域的动态绘制与交互应用

1. 从零开始:在ArcGIS地图上画个圈,其实很简单

你是不是也遇到过这样的需求?在地图上圈出一块区域,比如想看看公司周边5公里范围内有多少家咖啡店,或者规划一个物流配送的覆盖范围。这种“画个圈”的操作,在地理信息系统里太常见了。我第一次接触ArcGIS API for JavaScript时,也觉得这玩意儿肯定很复杂,但上手后发现,只要几行代码,一个活生生的圆形就能在地图上蹦出来。

咱们先别管那些复杂的“地理围栏”、“缓冲区分析”这些术语,就把它想象成在一张电子地图上用圆规画个圈。核心就三样东西:一张地图(MapView)、一个圆形的定义(Circle)、以及把这个圆形画出来的“画笔”(Graphic)。你提供的原始代码,就是一个非常经典的入门示例。我来带你一步步拆解,并且把它变得更灵活、更实用。

首先,你得有个地图容器。这就像画画需要画布一样。MapView就是你的画布和观察窗口。代码里的container: "viewDiv",就是告诉浏览器:“嘿,请把地图画在网页上那个ID叫viewDiv<div>标签里”。myMap则是地图的底图数据源,比如街道图、卫星图,这个需要你提前定义好。

接下来是重头戏——定义圆形。Circle这个类就是用来干这个的。它需要几个关键信息:

  • center(圆心):用经纬度 [经度, 纬度] 来指定。比如 [114.005431, 22.541693] 大概就是深圳福田区的位置。
  • radius(半径):这个圈有多大。
  • radiusUnit(半径单位):是米、公里,还是英里?这很重要,直接决定了圆的实际大小。

你可能会注意到原始代码里有一行被注释掉了:// numberOfPoints: 60。这个参数很有意思,它决定了这个“圆”由多少个点连接而成。数字越大,圆就越平滑,看起来更圆;数字越小,比如设为4,那画出来就是个正方形(不信你试试)。对于大多数情况,默认值就够用了,但如果你对图形精度有极致要求,或者需要优化性能(点越少,计算量越小),就可以调整它。

最后一步,把定义好的圆形“画”上去。这就需要Graphic(图形)和mapView.graphics.add()方法。Graphic就像一个包装盒,把几何形状(我们的圆)和它的样式(颜色、边框)打包在一起。symbol属性就是用来定义样式的,比如用半透明的蓝色填充,加上蓝色的虚线边框,这样既能看到圈内的区域,又不完全遮挡底图信息。

好了,理论说完了,我们来点实际的。下面是一个更完整、可以直接在HTML页面中运行的例子。我把它做成了一个简单的函数,你调用它就能在地图上画个圈。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no">
    <title>在ArcGIS地图上画个圆</title>
    <style>
        html, body, #viewDiv {
            padding: 0;
            margin: 0;
            height: 100%;
            width: 100%;
        }
    </style>
    <link rel="stylesheet" href="/https://js.arcgis.com/4.28/esri/themes/light/main.css">
    <script src="/https://js.arcgis.com/4.28/"></script>
    <script>
        require([
            "esri/Map",
            "esri/views/MapView",
            "esri/geometry/Circle",
            "esri/Graphic"
        ], function(Map, MapView, Circle, Graphic) {

            // 1. 创建地图和视图
            const map = new Map({
                basemap: "streets-navigation-vector" // 使用一个导航街道图作为底图
            });

            const view = new MapView({
                container: "viewDiv",
                map: map,
                center: [114.005431, 22.541693], // 初始地图中心点
                zoom: 12 // 初始缩放级别
            });

            // 2. 定义一个画圆的函数
            function drawCircle(centerLon, centerLat, radius, radiusUnit) {
                const circleGeometry = new Circle({
                    center: [centerLon, centerLat],
                    radius: radius,
                    radiusUnit: radiusUnit
                });

                // 3. 创建图形并添加到地图
                const circleGraphic = new Graphic({
                    geometry: circleGeometry,
                    symbol: {
                        type: "simple-fill",
                        color: [0, 119, 237, 0.2], // 蓝色,20%透明度
                        outline: {
                            color: [16, 127, 236],
                            width: 2
                        }
                    }
                });

                view.graphics.add(circleGraphic);
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值