ArcGIS JS 基础教程(5):地图限制缩放级别和显示范围

ArcGIS JS 基础教程(5):地图限制缩放级别和显示范围

零、写在前面

📌 本系列教程完整目录ArcGIS JS 系列基础教程(100个项目常用热门功能)

💡 在线示例 :完整可运行的 HTML 示例,无需任何环境配置,可直接在浏览器中打开体验

🗂️ 专栏导航 :收藏 + 关注,专栏文章第一时间送达

❤️ 一键三连:点赞(给教程充电)+ 评论(提问必回)+ 收藏(下次再看)

一、功能介绍

限制地图的缩放级别和显示范围,防止用户过度缩放或平移到无关区域,适用于需要固定视角范围的应用场景(如城市级地图应用、局部区域分析等)。

二、功能实现

利用 SceneViewconstraints 属性配置缩放级别限制(minZoommaxZoom)和几何范围限制(geometry),同时通过 view.goTo() 方法在设置限制后自动定位到限定范围。

三、功能应用

  1. 城市级应用:限制地图范围在北京市行政区域内,避免用户浏览到无关区域。
  2. 局部分析:在某一区域(如某景区、某园区)内进行可视化分析时,固定地图视角范围。
  3. 防止误操作:限制最小/最大缩放级别,避免用户过度缩放导致地图空白或细节丢失。

四、核心代码

html 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>第5课:地图限制缩放级别和显示范围</title>
    <link rel="stylesheet" href="https://js.arcgis.com/5.0/esri/themes/light/main.css">
    <script type="module" src="https://js.arcgis.com/5.0/"></script>
    <style>
        body { margin: 0; padding: 0; font-family: "Microsoft YaHei", sans-serif; }
        #mapContainer { width: 100vw; height: 100vh; }
        .page-title {
            position: absolute; top: 20px; left: 50%; transform: translateX(-50%);
            background: rgba(255,255,255,0.95); padding: 10px 24px; border-radius: 6px;
            font-size: 18px; font-weight: bold; z-index: 100;
            box-shadow: 0 2px 8px rgba(0,0,0,0.15);
        }
        .control-panel {
            position: absolute; top: 80px; right: 20px;
            background: rgba(255,255,255,0.95); padding: 16px; border-radius: 8px;
            box-shadow: 0 2px 12px rgba(0,0,0,0.15); z-index: 100; min-width: 200px;
        }
        .control-panel h3 { margin: 0 0 12px 0; font-size: 14px; border-bottom: 1px solid #eee; padding-bottom: 8px; }
        .btn-group { display: flex; flex-direction: column; gap: 8px; }
        .btn-group button {
            padding: 10px 16px; border: none; border-radius: 4px;
            cursor: pointer; font-size: 13px; font-weight: 500; transition: all 0.2s;
        }
        .btn-constraint { background: #1890ff; color: white; }
        .btn-constraint:hover { background: #40a9ff; }
        .btn-reset { background: #ff4d4f; color: white; }
        .btn-reset:hover { background: #ff7875; }
        .info-panel {
            position: absolute; bottom: 20px; left: 20px;
            background: rgba(255,255,255,0.95); padding: 12px 16px; border-radius: 6px;
            font-size: 13px; z-index: 100; min-width: 280px;
            box-shadow: 0 2px 8px rgba(0,0,0,0.15);
        }
        .info-panel span { display: block; margin: 4px 0; }
        .info-panel .status { padding: 4px 8px; border-radius: 4px; display: inline-block; }
        .status-normal { background: #f6ffed; color: #52c41a; }
        .status-limited { background: #fff7e6; color: #fa8c16; }
    </style>
</head>
<body>
<h1 class="page-title">第5课:地图限制缩放级别和显示范围</h1>
<div id="mapContainer"></div>
<div class="control-panel">
    <h3>范围控制</h3>
    <div class="btn-group">
        <button class="btn-constraint" id="setConstraint">设置限制(北京范围)</button>
        <button class="btn-reset" id="clearConstraint">清除限制</button>
    </div>
</div>
<div class="info-panel">
    <span>缩放级别:<span id="zoomInfo">13</span></span>
    <span>显示范围:<span id="extentInfo">全国视图</span></span>
    <span>状态:<span id="statusInfo" class="status status-normal">正常</span></span>
</div>
<script type="module">
    const Map = await $arcgis.import("@arcgis/core/Map.js");
    const SceneView = await $arcgis.import("@arcgis/core/views/SceneView.js");
    const Polygon = await $arcgis.import("@arcgis/geometry/Polygon.js");
    const getTianditu = await $arcgis.import("https://openlayers.vip/examples/resources/tianditu.js");
    const initState = { center: [116.4074, 39.9042], zoom: 12, minZoom: 2, maxZoom: 18 };
    const vecLayers = getTianditu.default({ type: "vec_w" });
    const map = new Map({
        basemap: { baseLayers: [vecLayers.base, vecLayers.anno] },
        ground: { surface: { elevationLayers: [{ url: "https://www.geosceneonline.cn/image/rest/services/OpenData/ChinaTerrain3D/ImageServer/" }] } }
    });
    const view = new SceneView({
        container: "mapContainer", map: map,
        center: initState.center, zoom: initState.zoom,
        constraints: { minZoom: initState.minZoom, maxZoom: initState.maxZoom },
        tilt: 45
    });
    // 北京范围(示例坐标,实际范围可调整)
    const beijingGeometry = new Polygon({
        rings: [[
            [115.7, 39.4], [117.5, 39.4],
            [117.5, 41.6], [115.7, 41.6],
            [115.7, 39.4]
        ]],
        spatialReference: { wkid: 4326 }
    });
    // 设置限制
    const applyConstraints = () => {
        view.constraints = {
            minZoom: 10,
            maxZoom: 16,
            geometry: beijingGeometry,
            rotationEnabled: false // 禁止旋转
        };
        view.goTo(beijingGeometry);
        document.getElementById("statusInfo").textContent = "已限制(北京范围)";
        document.getElementById("statusInfo").className = "status status-limited";
        document.getElementById("extentInfo").textContent = "北京市范围";
    };
    // 清除限制
    const clearConstraints = () => {
        view.constraints = {
            minZoom: initState.minZoom,
            maxZoom: initState.maxZoom,
            rotationEnabled: true
        };
        view.goTo({ center: initState.center, zoom: initState.zoom });
        document.getElementById("statusInfo").textContent = "正常";
        document.getElementById("statusInfo").className = "status status-normal";
        document.getElementById("extentInfo").textContent = "全国视图";
    };
    view.when(() => {
        document.getElementById("setConstraint").onclick = applyConstraints;
        document.getElementById("clearConstraint").onclick = clearConstraints;
        view.watch("zoom", (zoom) => {
            document.getElementById("zoomInfo").textContent = zoom.toFixed(1);
        });
        console.log("地图限制缩放级别和显示范围示例加载完成!");
    });
</script>
</body>
</html>

五、在线示例

🚀 在线体验https://southjor.github.io/arcgis-examples/lessons/lesson5.html

六、约束参数速查

参数 类型 说明 默认值
minZoom Number 最小缩放级别(可缩小到的最远级别) 0
maxZoom Number 最大缩放级别(可放大到的最近级别) 24
geometry Geometry 限制地图显示的范围(如多边形、矩形) null
rotationEnabled Boolean 是否允许地图旋转 true

六、系列导航

⬅️ 上一篇ArcGIS JS 基础教程(4):ArcGIS JS 基础教程(4):地图中心点定位(指定经纬度/地址)


💬 有问题欢迎在评论区留言,我会第一时间回复!

📢 关注我的专栏,后续持续更新 ArcGIS JS 100 个常用功能教程

相关推荐
智航GIS10 小时前
ArcGIS大师之路500技---078补零
arcgis
DXM05211 天前
第8期| 传统机器学习遥感解译:SVM & 随机森林分类全流程实操
人工智能·python·随机森林·机器学习·支持向量机·arcgis·自然语言处理
非科班Java出身GISer2 天前
ArcGIS JS 基础教程(9):天空盒与大气效果
arcgis·arcgis js 天空盒·arcgis js 大气效果·arcgis js 大气层·arcgis 场景背景
智航GIS2 天前
ArcGIS大师之路500技---078文件数据库的加密与解密
数据库·arcgis
步十人3 天前
【Vue3】前置知识简单概述(包括ES6核心语法,模块化ESM以及npm基础)
arcgis·npm·vue·es6
Lucky_云佳3 天前
ArcMap-去除底图水印
经验分享·arcgis·arcmap·google earth
雪的季节4 天前
ARGIS制图效果展示
arcgis
谷谷地图下载器7 天前
全球、台湾省的无水印·街景数据(离线数据),专为可视化项目定制,支持国产化
javascript·c++·3d·arcgis·sqlite
树谷-胡老师8 天前
2019-2025年-全球0.1°-月度-近实时人为CO₂排放-数据
arcgis
非科班Java出身GISer8 天前
ArcGIS JS 基础教程(8):环境光照与阴影
arcgis·arcgis js 环境光照·arcgis js阴影·arcgis js 环境·arcgis js 光照