arcgis-map-tools
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseArcGIS Map Tools
ArcGIS 地图工具
Use this skill for swipe comparison, measurement tools, identify operations, and routing services.
使用该技能实现滑动对比、测量工具、识别操作以及路径规划服务。
Swipe Widget
滑动组件
Swipe Component
Swipe 组件
html
<arcgis-map zoom="15" center="-154.88, 19.46">
<arcgis-zoom slot="top-left"></arcgis-zoom>
<arcgis-swipe swipe-position="32"></arcgis-swipe>
</arcgis-map>
<script type="module">
import Map from "@arcgis/core/Map.js";
import TileLayer from "@arcgis/core/layers/TileLayer.js";
const viewElement = document.querySelector("arcgis-map");
const arcgisSwipe = document.querySelector("arcgis-swipe");
const layer1 = new TileLayer({ url: "..." });
const layer2 = new TileLayer({ url: "..." });
viewElement.map = new Map({
basemap: "satellite",
layers: [layer1, layer2]
});
// Configure swipe when ready
arcgisSwipe.addEventListener("arcgisPropertyChange", (e) => {
if (e.detail.name === "state" && arcgisSwipe.state === "ready") {
arcgisSwipe.leadingLayers.add(layer1);
arcgisSwipe.trailingLayers.add(layer2);
}
});
</script>html
<arcgis-map zoom="15" center="-154.88, 19.46">
<arcgis-zoom slot="top-left"></arcgis-zoom>
<arcgis-swipe swipe-position="32"></arcgis-swipe>
</arcgis-map>
<script type="module">
import Map from "@arcgis/core/Map.js";
import TileLayer from "@arcgis/core/layers/TileLayer.js";
const viewElement = document.querySelector("arcgis-map");
const arcgisSwipe = document.querySelector("arcgis-swipe");
const layer1 = new TileLayer({ url: "..." });
const layer2 = new TileLayer({ url: "..." });
viewElement.map = new Map({
basemap: "satellite",
layers: [layer1, layer2]
});
// 组件就绪后配置滑动功能
arcgisSwipe.addEventListener("arcgisPropertyChange", (e) => {
if (e.detail.name === "state" && arcgisSwipe.state === "ready") {
arcgisSwipe.leadingLayers.add(layer1);
arcgisSwipe.trailingLayers.add(layer2);
}
});
</script>Swipe Widget (Core API) - Deprecated
Swipe 组件(核心API)- 已废弃
DEPRECATED since 4.32: Use thecomponent shown above instead. For information on widget deprecation, see Esri's move to web components.arcgis-swipe
javascript
// DEPRECATED - Use arcgis-swipe component instead
import Swipe from "@arcgis/core/widgets/Swipe.js";
const swipe = new Swipe({
view: view,
leadingLayers: [layer1],
trailingLayers: [layer2],
position: 50, // Percentage from left
direction: "horizontal" // or "vertical"
});
view.ui.add(swipe);【已废弃 4.32版本起】:请使用上方展示的组件。有关组件废弃的信息,请查看 Esri 向Web组件迁移计划。arcgis-swipe
javascript
// 已废弃 - 请使用arcgis-swipe组件替代
import Swipe from "@arcgis/core/widgets/Swipe.js";
const swipe = new Swipe({
view: view,
leadingLayers: [layer1],
trailingLayers: [layer2],
position: 50, // 距左侧的百分比
direction: "horizontal" // 或 "vertical"
});
view.ui.add(swipe);Measurement
测量功能
Measurement Components
测量组件
html
<!-- 2D Measurement -->
<arcgis-map>
<arcgis-distance-measurement-2d slot="top-right"></arcgis-distance-measurement-2d>
<arcgis-area-measurement-2d slot="top-right"></arcgis-area-measurement-2d>
</arcgis-map>
<!-- 3D Measurement -->
<arcgis-scene>
<arcgis-direct-line-measurement-3d slot="top-right"></arcgis-direct-line-measurement-3d>
<arcgis-area-measurement-3d slot="top-right"></arcgis-area-measurement-3d>
</arcgis-scene>html
<!-- 2D测量 -->
<arcgis-map>
<arcgis-distance-measurement-2d slot="top-right"></arcgis-distance-measurement-2d>
<arcgis-area-measurement-2d slot="top-right"></arcgis-area-measurement-2d>
</arcgis-map>
<!-- 3D测量 -->
<arcgis-scene>
<arcgis-direct-line-measurement-3d slot="top-right"></arcgis-direct-line-measurement-3d>
<arcgis-area-measurement-3d slot="top-right"></arcgis-area-measurement-3d>
</arcgis-scene>Measurement Widget (Core API)
测量组件(核心API)
javascript
import Measurement from "@arcgis/core/widgets/Measurement.js";
const measurement = new Measurement({
view: view
});
view.ui.add(measurement, "bottom-right");
// Activate distance measurement
// For 2D: "distance", For 3D: "direct-line"
measurement.activeTool = view.type === "2d" ? "distance" : "direct-line";
// Activate area measurement
measurement.activeTool = "area";
// Clear measurements
measurement.clear();javascript
import Measurement from "@arcgis/core/widgets/Measurement.js";
const measurement = new Measurement({
view: view
});
view.ui.add(measurement, "bottom-right");
// 激活距离测量
// 2D视图使用: "distance", 3D视图使用: "direct-line"
measurement.activeTool = view.type === "2d" ? "distance" : "direct-line";
// 激活面积测量
measurement.activeTool = "area";
// 清除测量结果
measurement.clear();2D Measurement Widgets (Core API)
2D测量组件(核心API)
javascript
import DistanceMeasurement2D from "@arcgis/core/widgets/DistanceMeasurement2D.js";
import AreaMeasurement2D from "@arcgis/core/widgets/AreaMeasurement2D.js";
// Distance measurement
const distanceWidget = new DistanceMeasurement2D({
view: view,
unit: "kilometers"
});
view.ui.add(distanceWidget, "top-right");
// Area measurement
const areaWidget = new AreaMeasurement2D({
view: view,
unit: "square-kilometers"
});
view.ui.add(areaWidget, "top-right");javascript
import DistanceMeasurement2D from "@arcgis/core/widgets/DistanceMeasurement2D.js";
import AreaMeasurement2D from "@arcgis/core/widgets/AreaMeasurement2D.js";
// 距离测量
const distanceWidget = new DistanceMeasurement2D({
view: view,
unit: "kilometers"
});
view.ui.add(distanceWidget, "top-right");
// 面积测量
const areaWidget = new AreaMeasurement2D({
view: view,
unit: "square-kilometers"
});
view.ui.add(areaWidget, "top-right");3D Measurement Widgets (Core API)
3D测量组件(核心API)
javascript
import DirectLineMeasurement3D from "@arcgis/core/widgets/DirectLineMeasurement3D.js";
import AreaMeasurement3D from "@arcgis/core/widgets/AreaMeasurement3D.js";
// Direct line measurement (3D)
const lineWidget = new DirectLineMeasurement3D({
view: sceneView,
unit: "meters"
});
// Area measurement (3D)
const areaWidget = new AreaMeasurement3D({
view: sceneView,
unit: "square-meters"
});javascript
import DirectLineMeasurement3D from "@arcgis/core/widgets/DirectLineMeasurement3D.js";
import AreaMeasurement3D from "@arcgis/core/widgets/AreaMeasurement3D.js";
// 3D直线测量
const lineWidget = new DirectLineMeasurement3D({
view: sceneView,
unit: "meters"
});
// 3D面积测量
const areaWidget = new AreaMeasurement3D({
view: sceneView,
unit: "square-meters"
});Identify
识别功能
Identify on MapImageLayer
在MapImageLayer上执行识别操作
javascript
import identify from "@arcgis/core/rest/identify.js";
import IdentifyParameters from "@arcgis/core/rest/support/IdentifyParameters.js";
const identifyURL = "https://sampleserver6.arcgisonline.com/arcgis/rest/services/MtBaldy_BaseMap/MapServer";
// Set up parameters
const params = new IdentifyParameters({
tolerance: 3,
layerIds: [0, 1, 2, 3, 4],
layerOption: "top", // "top", "visible", "all"
width: view.width,
height: view.height
});
// Execute on click
view.on("click", async (event) => {
params.geometry = event.mapPoint;
params.mapExtent = view.extent;
const response = await identify.identify(identifyURL, params);
const features = response.results.map(result => {
const feature = result.feature;
feature.attributes.layerName = result.layerName;
// Set popup template based on layer
if (result.layerName === "Roads") {
feature.popupTemplate = {
title: "Road",
content: "<b>Length:</b> {Shape_Length}"
};
}
return feature;
});
if (features.length > 0) {
view.openPopup({
features: features,
location: event.mapPoint
});
}
});javascript
import identify from "@arcgis/core/rest/identify.js";
import IdentifyParameters from "@arcgis/core/rest/support/IdentifyParameters.js";
const identifyURL = "https://sampleserver6.arcgisonline.com/arcgis/rest/services/MtBaldy_BaseMap/MapServer";
// 设置参数
const params = new IdentifyParameters({
tolerance: 3,
layerIds: [0, 1, 2, 3, 4],
layerOption: "top", // "top", "visible", "all"
width: view.width,
height: view.height
});
// 点击地图时执行识别
view.on("click", async (event) => {
params.geometry = event.mapPoint;
params.mapExtent = view.extent;
const response = await identify.identify(identifyURL, params);
const features = response.results.map(result => {
const feature = result.feature;
feature.attributes.layerName = result.layerName;
// 根据图层设置弹窗模板
if (result.layerName === "Roads") {
feature.popupTemplate = {
title: "道路",
content: "<b>长度:</b> {Shape_Length}"
};
}
return feature;
});
if (features.length > 0) {
view.openPopup({
features: features,
location: event.mapPoint
});
}
});Routing
路径规划
Basic Route
基础路径规划
javascript
import route from "@arcgis/core/rest/route.js";
import RouteParameters from "@arcgis/core/rest/support/RouteParameters.js";
import FeatureSet from "@arcgis/core/rest/support/FeatureSet.js";
import Graphic from "@arcgis/core/Graphic.js";
import GraphicsLayer from "@arcgis/core/layers/GraphicsLayer.js";
const routeUrl = "https://route-api.arcgis.com/arcgis/rest/services/World/Route/NAServer/Route_World";
const routeLayer = new GraphicsLayer();
map.add(routeLayer);
const routeParams = new RouteParameters({
apiKey: "YOUR_API_KEY",
stops: new FeatureSet(),
outSpatialReference: { wkid: 3857 }
});
// Add stop on click
view.on("click", async (event) => {
const stop = new Graphic({
geometry: event.mapPoint,
symbol: {
type: "simple-marker",
style: "cross",
size: 15
}
});
routeLayer.add(stop);
routeParams.stops.features.push(stop);
// Solve route when 2+ stops
if (routeParams.stops.features.length >= 2) {
const result = await route.solve(routeUrl, routeParams);
const routeResult = result.routeResults[0].route;
routeResult.symbol = {
type: "simple-line",
color: [0, 0, 255, 0.5],
width: 5
};
routeLayer.add(routeResult);
}
});javascript
import route from "@arcgis/core/rest/route.js";
import RouteParameters from "@arcgis/core/rest/support/RouteParameters.js";
import FeatureSet from "@arcgis/core/rest/support/FeatureSet.js";
import Graphic from "@arcgis/core/Graphic.js";
import GraphicsLayer from "@arcgis/core/layers/GraphicsLayer.js";
const routeUrl = "https://route-api.arcgis.com/arcgis/rest/services/World/Route/NAServer/Route_World";
const routeLayer = new GraphicsLayer();
map.add(routeLayer);
const routeParams = new RouteParameters({
apiKey: "YOUR_API_KEY",
stops: new FeatureSet(),
outSpatialReference: { wkid: 3857 }
});
// 点击地图添加途经点
view.on("click", async (event) => {
const stop = new Graphic({
geometry: event.mapPoint,
symbol: {
type: "simple-marker",
style: "cross",
size: 15
}
});
routeLayer.add(stop);
routeParams.stops.features.push(stop);
// 当添加2个及以上途经点时计算路径
if (routeParams.stops.features.length >= 2) {
const result = await route.solve(routeUrl, routeParams);
const routeResult = result.routeResults[0].route;
routeResult.symbol = {
type: "simple-line",
color: [0, 0, 255, 0.5],
width: 5
};
routeLayer.add(routeResult);
}
});Route with Options
带选项的路径规划
javascript
const routeParams = new RouteParameters({
apiKey: "YOUR_API_KEY",
stops: new FeatureSet({ features: stopGraphics }),
returnDirections: true,
directionsLanguage: "en",
returnRoutes: true,
returnStops: true,
impedanceAttribute: "TravelTime", // or "Miles", "Kilometers"
restrictionAttributes: ["Avoid Toll Roads"],
outSpatialReference: { wkid: 4326 }
});
const result = await route.solve(routeUrl, routeParams);
// Get directions
const directions = result.routeResults[0].directions;
directions.features.forEach(feature => {
console.log(feature.attributes.text);
});javascript
const routeParams = new RouteParameters({
apiKey: "YOUR_API_KEY",
stops: new FeatureSet({ features: stopGraphics }),
returnDirections: true,
directionsLanguage: "en",
returnRoutes: true,
returnStops: true,
impedanceAttribute: "TravelTime", // 或 "Miles", "Kilometers"
restrictionAttributes: ["Avoid Toll Roads"],
outSpatialReference: { wkid: 4326 }
});
const result = await route.solve(routeUrl, routeParams);
// 获取导航指引
const directions = result.routeResults[0].directions;
directions.features.forEach(feature => {
console.log(feature.attributes.text);
});Directions Widget
导航组件
Directions Component
导航组件
html
<arcgis-map>
<arcgis-directions slot="top-right"></arcgis-directions>
</arcgis-map>html
<arcgis-map>
<arcgis-directions slot="top-right"></arcgis-directions>
</arcgis-map>Directions Widget (Core API)
导航组件(核心API)
javascript
import Directions from "@arcgis/core/widgets/Directions.js";
const directions = new Directions({
view: view,
apiKey: "YOUR_API_KEY"
});
view.ui.add(directions, "top-right");javascript
import Directions from "@arcgis/core/widgets/Directions.js";
const directions = new Directions({
view: view,
apiKey: "YOUR_API_KEY"
});
view.ui.add(directions, "top-right");打印功能
Print Component
打印组件
html
<arcgis-map item-id="YOUR_WEBMAP_ID">
<arcgis-expand slot="top-right" expand-tooltip="Print">
<arcgis-print></arcgis-print>
</arcgis-expand>
</arcgis-map>html
<arcgis-map item-id="YOUR_WEBMAP_ID">
<arcgis-expand slot="top-right" expand-tooltip="打印">
<arcgis-print></arcgis-print>
</arcgis-expand>
</arcgis-map>Print Service
打印服务
javascript
import print from "@arcgis/core/rest/print.js";
import PrintTemplate from "@arcgis/core/rest/support/PrintTemplate.js";
import PrintParameters from "@arcgis/core/rest/support/PrintParameters.js";
const printUrl = "https://utility.arcgisonline.com/arcgis/rest/services/Utilities/PrintingTools/GPServer/Export%20Web%20Map%20Task";
const template = new PrintTemplate({
format: "pdf",
layout: "a4-landscape",
layoutOptions: {
titleText: "My Map",
authorText: "Author Name"
}
});
const params = new PrintParameters({
view: view,
template: template
});
const result = await print.execute(printUrl, params);
console.log("PDF URL:", result.url);javascript
import print from "@arcgis/core/rest/print.js";
import PrintTemplate from "@arcgis/core/rest/support/PrintTemplate.js";
import PrintParameters from "@arcgis/core/rest/support/PrintParameters.js";
const printUrl = "https://utility.arcgisonline.com/arcgis/rest/services/Utilities/PrintingTools/GPServer/Export%20Web%20Map%20Task";
const template = new PrintTemplate({
format: "pdf",
layout: "a4-landscape",
layoutOptions: {
titleText: "我的地图",
authorText: "作者名称"
}
});
const params = new PrintParameters({
view: view,
template: template
});
const result = await print.execute(printUrl, params);
console.log("PDF地址:", result.url);PrintTemplate Configuration
打印模板配置
javascript
import PrintTemplate from "@arcgis/core/rest/support/PrintTemplate.js";
const template = new PrintTemplate({
// Output format
format: "pdf", // pdf, png32, png8, jpg, gif, eps, svg, svgz
// Layout template name (from print service)
layout: "a4-landscape", // Or custom layout name
// Export options for map-only output
exportOptions: {
width: 800,
height: 600,
dpi: 300
},
// Layout customization
layoutOptions: {
titleText: "Map Title",
authorText: "Created by",
copyrightText: "Copyright 2024",
scalebarUnit: "Kilometers", // Kilometers, Miles
legendLayers: [], // Layers to include in legend
customTextElements: [
{ customText: "Custom field value" }
]
},
// Preserve scale or extent
outScale: 50000, // Fixed scale
scalePreserved: true, // Maintain current scale
// Include attribution
attributionVisible: true
});javascript
import PrintTemplate from "@arcgis/core/rest/support/PrintTemplate.js";
const template = new PrintTemplate({
// 输出格式
format: "pdf", // pdf, png32, png8, jpg, gif, eps, svg, svgz
// 布局模板名称(来自打印服务)
layout: "a4-landscape", // 或自定义布局名称
// 仅地图输出的导出选项
exportOptions: {
width: 800,
height: 600,
dpi: 300
},
// 布局自定义
layoutOptions: {
titleText: "地图标题",
authorText: "创建者",
copyrightText: "版权所有 2024",
scalebarUnit: "Kilometers", // Kilometers, Miles
legendLayers: [], // 图例中包含的图层
customTextElements: [
{ customText: "自定义字段值" }
]
},
// 保留比例尺或范围
outScale: 50000, // 固定比例尺
scalePreserved: true, // 保持当前比例尺
// 包含版权信息
attributionVisible: true
});Print Formats
打印格式
| Format | Description |
|---|---|
| Adobe PDF |
| PNG with transparency (32-bit) |
| PNG 8-bit |
| JPEG |
| GIF |
| Encapsulated PostScript |
| Scalable Vector Graphics |
| Compressed SVG |
| 格式 | 说明 |
|---|---|
| Adobe PDF |
| 带透明度的PNG(32位) |
| 8位PNG |
| JPEG |
| GIF |
| 封装式PostScript |
| 可缩放矢量图形 |
| 压缩版SVG |
Print Layouts
打印布局
javascript
// Get available layouts from print service
const printInfo = await print.getInfo(printUrl);
console.log("Available layouts:");
printInfo.layouts.forEach(layout => {
console.log(`- ${layout.name}`);
});
console.log("Available formats:");
printInfo.formats.forEach(format => {
console.log(`- ${format}`);
});javascript
// 从打印服务获取可用布局
const printInfo = await print.getInfo(printUrl);
console.log("可用布局:");
printInfo.layouts.forEach(layout => {
console.log(`- ${layout.name}`);
});
console.log("可用格式:");
printInfo.formats.forEach(format => {
console.log(`- ${format}`);
});Map-Only Export (No Layout)
仅地图导出(无布局)
javascript
const template = new PrintTemplate({
format: "png32",
layout: "map-only", // No layout template
exportOptions: {
width: 1920,
height: 1080,
dpi: 96
}
});javascript
const template = new PrintTemplate({
format: "png32",
layout: "map-only", // 不使用布局模板
exportOptions: {
width: 1920,
height: 1080,
dpi: 96
}
});High-Resolution Export
高分辨率导出
javascript
const template = new PrintTemplate({
format: "pdf",
layout: "a3-landscape",
exportOptions: {
dpi: 300 // High DPI for print quality
},
layoutOptions: {
titleText: "High Resolution Map",
scalebarUnit: "Miles"
},
scalePreserved: true
});javascript
const template = new PrintTemplate({
format: "pdf",
layout: "a3-landscape",
exportOptions: {
dpi: 300 // 打印级别的高分辨率
},
layoutOptions: {
titleText: "高分辨率地图",
scalebarUnit: "Miles"
},
scalePreserved: true
});Print with Custom Extent
自定义范围打印
javascript
const template = new PrintTemplate({
format: "pdf",
layout: "letter-ansi-a-landscape",
outScale: 24000 // 1:24000 scale
});
const params = new PrintParameters({
view: view,
template: template,
extraParameters: {
// Custom extent (optional)
extent: {
xmin: -117.2,
ymin: 34.0,
xmax: -117.1,
ymax: 34.1,
spatialReference: { wkid: 4326 }
}
}
});javascript
const template = new PrintTemplate({
format: "pdf",
layout: "letter-ansi-a-landscape",
outScale: 24000 // 1:24000比例尺
});
const params = new PrintParameters({
view: view,
template: template,
extraParameters: {
// 自定义范围(可选)
extent: {
xmin: -117.2,
ymin: 34.0,
xmax: -117.1,
ymax: 34.1,
spatialReference: { wkid: 4326 }
}
}
});Print Widget (Core API)
打印组件(核心API)
javascript
import Print from "@arcgis/core/widgets/Print.js";
const print = new Print({
view: view,
printServiceUrl: "https://utility.arcgisonline.com/arcgis/rest/services/Utilities/PrintingTools/GPServer/Export%20Web%20Map%20Task"
});
view.ui.add(print, "top-right");javascript
import Print from "@arcgis/core/widgets/Print.js";
const print = new Print({
view: view,
printServiceUrl: "https://utility.arcgisonline.com/arcgis/rest/services/Utilities/PrintingTools/GPServer/Export%20Web%20Map%20Task"
});
view.ui.add(print, "top-right");Print Widget Configuration (Core API)
打印组件配置(核心API)
javascript
import Print from "@arcgis/core/widgets/Print.js";
const print = new Print({
view: view,
printServiceUrl: printUrl,
// Allowed formats
allowedFormats: ["pdf", "png32", "jpg"],
// Allowed layouts
allowedLayouts: ["a4-landscape", "a4-portrait", "letter-ansi-a-landscape"],
// Default template settings
templateOptions: {
title: "Default Map Title",
author: "Default Author",
copyright: "Copyright 2024",
scaleEnabled: true,
attributionEnabled: true
},
// Include legend
includeDefaultTemplates: true
});javascript
import Print from "@arcgis/core/widgets/Print.js";
const print = new Print({
view: view,
printServiceUrl: printUrl,
// 允许的格式
allowedFormats: ["pdf", "png32", "jpg"],
// 允许的布局
allowedLayouts: ["a4-landscape", "a4-portrait", "letter-ansi-a-landscape"],
// 默认模板设置
templateOptions: {
title: "默认地图标题",
author: "默认作者",
copyright: "版权所有 2024",
scaleEnabled: true,
attributionEnabled: true
},
// 包含默认模板
includeDefaultTemplates: true
});Print Widget Events
打印组件事件
javascript
// Listen for print completion
print.viewModel.on("complete", (event) => {
console.log("Print complete:", event.url);
window.open(event.url, "_blank");
});
// Listen for errors
print.viewModel.on("error", (event) => {
console.error("Print error:", event.error);
});
// Track progress
print.viewModel.watch("state", (state) => {
console.log("Print state:", state); // ready, printing, complete, error
});javascript
// 监听打印完成事件
print.viewModel.on("complete", (event) => {
console.log("打印完成:", event.url);
window.open(event.url, "_blank");
});
// 监听错误事件
print.viewModel.on("error", (event) => {
console.error("打印错误:", event.error);
});
// 跟踪打印进度
print.viewModel.watch("state", (state) => {
console.log("打印状态:", state); // ready, printing, complete, error
});Custom Print Workflow
自定义打印工作流
javascript
async function printMap(view, options = {}) {
const {
title = "Map Export",
format = "pdf",
layout = "a4-landscape",
dpi = 150
} = options;
const template = new PrintTemplate({
format,
layout,
exportOptions: { dpi },
layoutOptions: {
titleText: title,
authorText: "Generated by Web App",
copyrightText: `Exported: ${new Date().toLocaleDateString()}`
}
});
const params = new PrintParameters({
view,
template
});
try {
const result = await print.execute(printUrl, params);
return result.url;
} catch (error) {
console.error("Print failed:", error);
throw error;
}
}
// Usage
const pdfUrl = await printMap(view, {
title: "Project Area Map",
format: "pdf",
dpi: 300
});
window.open(pdfUrl, "_blank");javascript
async function printMap(view, options = {}) {
const {
title = "地图导出",
format = "pdf",
layout = "a4-landscape",
dpi = 150
} = options;
const template = new PrintTemplate({
format,
layout,
exportOptions: { dpi },
layoutOptions: {
titleText: title,
authorText: "由Web应用生成",
copyrightText: `导出时间: ${new Date().toLocaleDateString()}`
}
});
const params = new PrintParameters({
view,
template
});
try {
const result = await print.execute(printUrl, params);
return result.url;
} catch (error) {
console.error("打印失败:", error);
throw error;
}
}
// 使用示例
const pdfUrl = await printMap(view, {
title: "项目区域地图",
format: "pdf",
dpi: 300
});
window.open(pdfUrl, "_blank");Print with Legend Customization
自定义图例打印
javascript
const template = new PrintTemplate({
format: "pdf",
layout: "a4-landscape",
layoutOptions: {
titleText: "Map with Custom Legend",
// Specify which layers to include in legend
legendLayers: [
{ layerId: featureLayer.id },
{ layerId: anotherLayer.id, sublayerIds: [0, 2] } // Specific sublayers
]
}
});javascript
const template = new PrintTemplate({
format: "pdf",
layout: "a4-landscape",
layoutOptions: {
titleText: "带自定义图例的地图",
// 指定图例中包含的图层
legendLayers: [
{ layerId: featureLayer.id },
{ layerId: anotherLayer.id, sublayerIds: [0, 2] } // 特定子图层
]
}
});Screenshot as Alternative
截图替代方案
For quick exports without a print service:
javascript
// Take screenshot of current view
const screenshot = await view.takeScreenshot({
format: "png",
width: 1920,
height: 1080,
quality: 90
});
// Use the data URL
const img = document.createElement("img");
img.src = screenshot.dataUrl;
document.body.appendChild(img);
// Or download
const link = document.createElement("a");
link.download = "map-screenshot.png";
link.href = screenshot.dataUrl;
link.click();无需打印服务的快速导出方式:
javascript
// 截取当前视图的截图
const screenshot = await view.takeScreenshot({
format: "png",
width: 1920,
height: 1080,
quality: 90
});
// 使用数据URL显示图片
const img = document.createElement("img");
img.src = screenshot.dataUrl;
document.body.appendChild(img);
// 或下载图片
const link = document.createElement("a");
link.download = "map-screenshot.png";
link.href = screenshot.dataUrl;
link.click();Find
查找功能
Find Service
查找服务
javascript
import find from "@arcgis/core/rest/find.js";
import FindParameters from "@arcgis/core/rest/support/FindParameters.js";
const findUrl = "https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer";
const params = new FindParameters({
searchText: "California",
layerIds: [0, 1, 2],
searchFields: ["STATE_NAME", "NAME"],
returnGeometry: true
});
const result = await find.find(findUrl, params);
result.results.forEach(r => {
console.log(r.feature.attributes);
});javascript
import find from "@arcgis/core/rest/find.js";
import FindParameters from "@arcgis/core/rest/support/FindParameters.js";
const findUrl = "https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer";
const params = new FindParameters({
searchText: "California",
layerIds: [0, 1, 2],
searchFields: ["STATE_NAME", "NAME"],
returnGeometry: true
});
const result = await find.find(findUrl, params);
result.results.forEach(r => {
console.log(r.feature.attributes);
});Complete Example
完整示例
html
<!DOCTYPE html>
<html>
<head>
<script type="module" src="https://js.arcgis.com/calcite-components/3.3.3/calcite.esm.js"></script>
<script src="https://js.arcgis.com/4.34/"></script>
<script type="module" src="https://js.arcgis.com/4.34/map-components/"></script>
<style>
html, body { height: 100%; margin: 0; }
#toolbar { position: absolute; top: 10px; right: 10px; }
</style>
</head>
<body>
<arcgis-map basemap="streets-navigation-vector" center="-117.195, 34.057" zoom="13">
<arcgis-zoom slot="top-left"></arcgis-zoom>
</arcgis-map>
<div id="toolbar">
<calcite-button id="measureBtn">Measure</calcite-button>
<calcite-button id="clearBtn">Clear</calcite-button>
</div>
<script type="module">
import Measurement from "@arcgis/core/widgets/Measurement.js";
const viewElement = document.querySelector("arcgis-map");
await viewElement.viewOnReady();
const measurement = new Measurement({ view: viewElement });
viewElement.ui.add(measurement, "bottom-right");
document.getElementById("measureBtn").onclick = () => {
measurement.activeTool = "distance";
};
document.getElementById("clearBtn").onclick = () => {
measurement.clear();
};
</script>
</body>
</html>html
<!DOCTYPE html>
<html>
<head>
<script type="module" src="https://js.arcgis.com/calcite-components/3.3.3/calcite.esm.js"></script>
<script src="https://js.arcgis.com/4.34/"></script>
<script type="module" src="https://js.arcgis.com/4.34/map-components/"></script>
<style>
html, body { height: 100%; margin: 0; }
#toolbar { position: absolute; top: 10px; right: 10px; }
</style>
</head>
<body>
<arcgis-map basemap="streets-navigation-vector" center="-117.195, 34.057" zoom="13">
<arcgis-zoom slot="top-left"></arcgis-zoom>
</arcgis-map>
<div id="toolbar">
<calcite-button id="measureBtn">测量</calcite-button>
<calcite-button id="clearBtn">清除</calcite-button>
</div>
<script type="module">
import Measurement from "@arcgis/core/widgets/Measurement.js";
const viewElement = document.querySelector("arcgis-map");
await viewElement.viewOnReady();
const measurement = new Measurement({ view: viewElement });
viewElement.ui.add(measurement, "bottom-right");
document.getElementById("measureBtn").onclick = () => {
measurement.activeTool = "distance";
};
document.getElementById("clearBtn").onclick = () => {
measurement.clear();
};
</script>
</body>
</html>Common Pitfalls
常见注意事项
-
API Key for routing: Route service requires valid API key or authenticated user
-
Identify tolerance: Set appropriate tolerance based on zoom level
-
Swipe layer order: Leading/trailing layers must be in the map's layers collection
-
Measurement units: Set appropriate units for the measurement context
-
3D vs 2D measurement: Use different widgets/tools for 2D and 3D views
-
路径规划的API密钥:路径规划服务需要有效的API密钥或已认证用户
-
识别容差:根据缩放级别设置合适的容差
-
滑动图层顺序:前景/背景图层必须已添加到地图的图层集合中
-
测量单位:根据测量场景设置合适的单位
-
3D与2D测量差异:2D和3D视图需使用不同的测量组件/工具