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

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

零、写在前面

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

💡 在线示例:完整可运行的 HTML 示例,无需任何环境配置,可直接在浏览器中打开体验
🗂️ 专栏导航:收藏 + 关注,专栏文章第一时间送达
❤️ 一键三连:点赞(给教程充电)+ 评论(提问必回)+ 收藏(下次再看)

一、功能介绍

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

二、功能实现

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

三、功能应用

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

    四、核心代码

    <!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 基础教程(6):地图弹窗信息窗口


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

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

相关文章
|
1天前
|
云安全 安全 网络安全
|
1天前
|
JavaScript 安全 前端开发
Nodejs Brotli decoder 代码执行漏洞 (CVE-2026-111497)10629
Node.js发布安全更新修复Brotli解码器高危RCE漏洞(CVE-2026-111497),建议受影响版本用户立即升级。
1617 0
|
8天前
|
人工智能 API 开发工具
DeepSeek Harness 神插件:白嫖 13 家大厂模型
`dsh-our-free-model` 是 DeepSeek Harness 神级插件:零配置、零API Key、零账号,聚合13家大厂免费模型(含DeepSeek V4.1 Flash、Kimi K3等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
1314 28
|
3天前
|
存储 人工智能 自然语言处理
阿里云千问办公官网登录入口:qwenwork.cn网页版免下载,注册送2000积分、登录每日再送100积分
千问办公(QwenWork)是阿里巴巴推出的一站式AI办公平台,定位"不止于对话,更注重交付"。它基于千问大模型,具备任务拆解与多步骤自动执行能力,用户一句话即可完成PPT生成、数据分析、网页搭建、视频剪辑、信息调研等复杂任务,覆盖网页端、桌面端及钉钉生态。网页版免下载,访问qwenwork.cn注册即得2000积分,每日登录再送100积分。个人版免费起用,另有付费版与企业版可选。
|
12天前
|
存储 人工智能 安全
千问办公官网入口网页版登录:qwenwork.cn 注册送2000积分、登录送100积分
阿里云千问办公(QwenWork)是AI智能工作平台,支持一句话生成PPT、表格、网页、视频及数据分析。个人免费版送2000积分+每日登录赠100分,含1GB存储、5个发布页;企业版198元/席/月起。阿里千问办公QwenWork官网:https://t.aliyun.com/U/0VCTGt 阿里AI工作平台,一句话完成数据分析、PPT 生成、视频剪辑、网页搭建等复杂任务
|
7天前
|
人工智能 开发者
Qoder CN 大使计划正式开启|无限创造,等你一起
全年免费积分、优先内测、活动支持与更多共创机会,邀请用 Qoder 把想法变成现实的你。
616 6
|
9天前
|
安全 Linux 芯片
【万字长文】Ollama下载、安装、配置、使用保姆级教程(2026最新图解)
Ollama 是一款免费开源的本地大模型运行工具,支持 DeepSeek、Qwen 等主流模型,一条命令即可下载运行。2026 最新版 v0.35.1 官方安装包(1.47GB)已提供国内直连下载,纯本地、离线可用、无广告、无隐私泄露风险。
848 2
|
1月前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
10108 33
|
1天前
|
安全 应用服务中间件 Go
PHP2Shell 漏洞拆解:WordPress 与 nginx 为何中招
PHP2Shell 双 RCE 已遭在野利用:WordPress、Drupal 全在射程内,nginx 其实另有洞。拆成因与修复顺序
PHP2Shell 漏洞拆解:WordPress 与 nginx 为何中招
|
9天前
|
Web App开发 人工智能 JavaScript
太猛了,一个月干到15W+,给大家推荐一个最近爆火的开源逆向工具:REA
REA(Reverse Engineer Anything)是近期爆火的开源AI逆向工具,4月发布,1个月内斩获15万+ Star。它让AI Agent无需源码即可分析二进制、APK、JS/Electron、HAR包等17类目标,自动反编译、生成可运行代码,并强制返回带证据与局限的结论。全本地执行,MIT协议,支持Hopper/Ghidra/IDA等引擎,一行命令即可上手。
852 2
太猛了,一个月干到15W+,给大家推荐一个最近爆火的开源逆向工具:REA