arcgis-rest-services について
arcgis-rest-services は、@arcgis/core/rest モジュールで ArcGIS Server REST エンドポイントを呼び出す開発者向けスキルです。空間クエリに加え、ルート検索、ジオコーディング、場所検索、ジオプロセシング、地図印刷を扱います。
主な機能
- 01静的および動的な ESM インポート
- 02ルート検索とサービスエリア解析
- 03ジオコーディングと場所検索
- 04フィーチャーのクエリと識別
- 05ジオプロセシングとジオメトリ操作
- 06サーバー側での地図出力
活用シーン
- 01複数の停留地点間のルート検索
- 02住所のジオコーディングや周辺施設の検索
- 03フィーチャーのクエリと地図上の位置特定
- 04ジオプロセシングの実行や地図の出力
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ saschabrunnerch/ arcgis-maps-sdk-js-ai-context --skill arcgis-rest-servicesインストール後、Claude Code で/arcgis-rest-servicesを入力して読み込まれたか確認します。
詳細
ArcGIS REST サービス
@arcgis/core/rest/* 名前空間を通じて ArcGIS Server REST エンドポイントを呼び出す場合に、このスキルを使用してください。ルーティング、ジオコーディング、空間クエリ、ジオプロセシング、印刷、場所検索、その他のサーバー側の操作について説明します。
インポートパターン
ESM の直接インポート
import * as route from "@arcgis/core/rest/route.js";
import * as locator from "@arcgis/core/rest/locator.js";
import * as query from "@arcgis/core/rest/query.js";
import RouteParameters from "@arcgis/core/rest/support/RouteParameters.js";
import FeatureSet from "@arcgis/core/rest/support/FeatureSet.js";
import Query from "@arcgis/core/rest/support/Query.js";
動的インポート(CDN)
const route = await $arcgis.import("@arcgis/core/rest/route.js");
const locator = await $arcgis.import("@arcgis/core/rest/locator.js");
const [query, Query] = await $arcgis.import([
"@arcgis/core/rest/query.js",
"@arcgis/core/rest/support/Query.js",
]);
すべての REST サービス関数では、サービス URL を第 1 引数、パラメーターオブジェクトを第 2 引数として受け取ります。
const result = await serviceName.methodName(serviceUrl, params);
ルート
オプションのバリアとルート案内を指定して、地点間のルートを求めます。
import * as 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";
const stops = new FeatureSet({
features: [
new Graphic({
geometry: { type: "point", longitude: -117.195, latitude: 34.057 },
attributes: { Name: "Start" },
}),
new Graphic({
geometry: { type: "point", longitude: -117.918, latitude: 33.812 },
attributes: { Name: "End" },
}),
],
});
const routeParams = new RouteParameters({
stops,
outSpatialReference: { wkid: 4326 },
returnDirections: true,
returnRoutes: true,
directionsLanguage: "en",
});
const routeUrl =
"https://route-api.arcgis.com/arcgis/rest/services/World/Route/NAServer/Route_World";
const result = await route.solve(routeUrl, routeParams);
const routeResult = result.routeResults[0];
const routeGeometry = routeResult.route.geometry;
// Display directions
routeResult.directions.features.forEach((feature) => {
console.log(
feature.attributes.text,
feature.attributes.length.toFixed(2),
"miles",
);
});
バリアを指定したルート
const pointBarriers = new FeatureSet({
features: [
new Graphic({
geometry: { type: "point", longitude: -117.5, latitude: 33.9 },
}),
],
});
const routeParams = new RouteParameters({
stops,
pointBarriers,
outSpatialReference: { wkid: 4326 },
returnDirections: true,
});
const result = await route.solve(routeUrl, routeParams);
最寄り施設
一連のインシデントに最も近い施設を検索します。
import * as closestFacility from "@arcgis/core/rest/closestFacility.js";
import ClosestFacilityParameters from "@arcgis/core/rest/support/ClosestFacilityParameters.js";
import FeatureSet from "@arcgis/core/rest/support/FeatureSet.js";
const facilities = new FeatureSet({
features: [
new Graphic({
geometry: { type: "point", longitude: -117.2, latitude: 34.06 },
}),
new Graphic({
geometry: { type: "point", longitude: -117.3, latitude: 34.1 },
}),
],
});
const incidents = new FeatureSet({
features: [
new Graphic({
geometry: { type: "point", longitude: -117.19, latitude: 34.05 },
}),
],
});
const params = new ClosestFacilityParameters({
facilities,
incidents,
defaultTargetFacilityCount: 1,
returnRoutes: true,
returnDirections: true,
outSpatialReference: { wkid: 4326 },
});
const cfUrl =
"https://route-api.arcgis.com/arcgis/rest/services/World/ClosestFacility/NAServer/ClosestFacility_World";
const result = await closestFacility.solve(cfUrl, params);
const closestRoute = result.routes[0];
console.log("Distance:", closestRoute.attributes.Total_Kilometers, "km");
サービスエリア
移動時間または距離に基づいて、施設周辺のサービスエリアポリゴンを生成します。
import * as serviceArea from "@arcgis/core/rest/serviceArea.js";
import ServiceAreaParameters from "@arcgis/core/rest/support/ServiceAreaParameters.js";
const params = new ServiceAreaParameters({
facilities: facilitiesFeatureSet,
defaultBreaks: [5, 10, 15], // minutes
trimOuterPolygon: true,
outSpatialReference: { wkid: 4326 },
});
const saUrl =
"https://route-api.arcgis.com/arcgis/rest/services/World/ServiceAreas/NAServer/ServiceArea_World";
const result = await serviceArea.solve(saUrl, params);
result.serviceAreaPolygons.forEach((polygon) => {
console.log(
"Break:",
polygon.attributes.FromBreak,
"-",
polygon.attributes.ToBreak,
"min",
);
});
ロケーター(ジオコーディング)
住所から位置を取得
import * as locator from "@arcgis/core/rest/locator.js";
const geocodeUrl =
"https://geocode-api.arcgis.com/arcgis/rest/services/World/GeocodeServer";
const results = await locator.addressToLocations(geocodeUrl, {
address: { SingleLine: "380 New York St, Redlands, CA" },
outFields: ["Addr_type", "Match_addr", "StAddr", "City"],
maxLocations: 5,
});
results.forEach((result) => {
console.log(result.address); // Matched address
console.log(result.location); // Point geometry
console.log(result.score); // Match score (0-100)
});
位置から住所を取得(逆ジオコーディング)
const result = await locator.locationToAddress(geocodeUrl, {
location: { type: "point", longitude: -117.195, latitude: 34.057 },
});
console.log(result.address);
console.log(result.attributes);
位置候補を提案(オートコンプリート)
const suggestions = await locator.suggestLocations(geocodeUrl, {
text: "380 New York",
location: { type: "point", longitude: -117.195, latitude: 34.057 },
});
suggestions.forEach((suggestion) => {
console.log(suggestion.text);
console.log(suggestion.magicKey);
});
// Use magicKey to get the full result
const results = await locator.addressToLocations(geocodeUrl, {
address: { SingleLine: suggestions[0].text },
magicKey: suggestions[0].magicKey,
outFields: ["*"],
});
クエリ(REST)
FeatureLayer を使わずに、フィーチャサービスのエンドポイントに対して直接フィーチャをクエリします。
import * as query from "@arcgis/core/rest/query.js";
import Query from "@arcgis/core/rest/support/Query.js";
const featureServiceUrl =
"https://services.arcgis.com/V6ZHFr6zdgNZuVG0/arcgis/rest/services/Landscape_Trees/FeatureServer/0";
const queryParams = new Query({
where: "Height > 50",
outFields: ["*"],
returnGeometry: true,
outSpatialReference: { wkid: 4326 },
});
// JSON result
const result = await query.executeQueryJSON(featureServiceUrl, queryParams);
console.log("Features found:", result.features.length);
// Count only
const count = await query.executeForCount(featureServiceUrl, queryParams);
// Extent only
const extentResult = await query.executeForExtent(
featureServiceUrl,
queryParams,
);
// Object IDs only
const ids = await query.executeForIds(featureServiceUrl, queryParams);
クエリメソッド
| メソッド | 戻り値 | 用途 |
|---|---|---|
executeQueryJSON(url, query) | FeatureSet | フィーチャデータ全体 |
executeQueryPBF(url, query) | FeatureSet | ペイロードの縮小(PBF 形式) |
executeForCount(url, query) | number | フィーチャ数のみ |
executeForExtent(url, query) | { count, extent } | バウンディングボックスと件数 |
executeForIds(url, query) | number[] | オブジェクト ID のみ |
検索
属性値を使ってマップサービス内のフィーチャを検索します。
import * as find from "@arcgis/core/rest/find.js";
import FindParameters from "@arcgis/core/rest/support/FindParameters.js";
const params = new FindParameters({
searchText: "Los Angeles",
layerIds: [0, 1, 2],
searchFields: ["Name", "City"],
returnGeometry: true,
outSpatialReference: { wkid: 4326 },
});
const mapServiceUrl =
"https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer";
const result = await find.find(mapServiceUrl, params);
result.results.forEach((findResult) => {
console.log("Layer:", findResult.layerId, "Value:", findResult.value);
});
識別
マップサービス上の指定した位置にあるフィーチャを識別します。
import * as identify from "@arcgis/core/rest/identify.js";
import IdentifyParameters from "@arcgis/core/rest/support/IdentifyParameters.js";
const params = new IdentifyParameters({
geometry: view.toMap(screenPoint),
mapExtent: view.extent,
tolerance: 3,
width: view.width,
height: view.height,
layerOption: "all",
returnGeometry: true,
spatialReference: view.spatialReference,
});
const mapServiceUrl =
"https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer";
const result = await identify.identify(mapServiceUrl, params);
result.results.forEach((identifyResult) => {
console.log("Layer:", identifyResult.layerName);
console.log("Attributes:", identifyResult.feature.attributes);
});
印刷
サーバー側の印刷サービスを通じて、マップを PDF、PNG、その他の形式でエクスポートします。
import * as 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 template = new PrintTemplate({
format: "pdf",
layout: "letter-ansi-a-landscape",
layoutOptions: {
titleText: "My Map Export",
authorText: "Map Author",
scalebarUnit: "Miles",
},
exportOptions: {
dpi: 300,
width: 800,
height: 1100,
},
});
const params = new PrintParameters({
view,
template,
});
const printUrl =
"https://utility.arcgisonline.com/arcgis/rest/services/Utilities/PrintingTools/GPServer/Export%20Web%20Map%20Task";
const result = await print.execute(printUrl, params);
window.open(result.url);
場所検索
ArcGIS Places サービスを使って、ポイント オブ インタレスト(POI)を検索します。
ポイント周辺の場所をクエリ
import * as places from "@arcgis/core/rest/places.js";
import PlacesQueryParameters from "@arcgis/core/rest/support/PlacesQueryParameters.js";
const queryParams = new PlacesQueryParameters({
categoryIds: ["13065"], // Restaurants
radius: 500, // meters
point: { type: "point", longitude: -87.626, latitude: 41.882 },
pageSize: 20,
});
const results = await places.queryPlacesNearPoint(queryParams);
results.results.forEach((place) => {
console.log(place.name, place.categories[0].label);
console.log("Distance:", place.distance, "m");
});
// Pagination
if (results.nextPage) {
const nextResults = await results.nextPage();
}
範囲内の場所をクエリ
const queryParams = new PlacesQueryParameters({
categoryIds: ["16000"], // Landmarks and Outdoors
xmin: -87.65,
ymin: 41.87,
xmax: -87.6,
ymax: 41.9,
});
const results = await places.queryPlacesWithinExtent(queryParams);
場所の詳細を取得
import FetchPlaceParameters from "@arcgis/core/rest/support/FetchPlaceParameters.js";
const fetchParams = new FetchPlaceParameters({
placeId: results.results[0].placeId,
requestedFields: ["all"],
});
const details = await places.fetchPlace(fetchParams);
const placeDetails = details.placeDetails;
console.log("Name:", placeDetails.name);
console.log("Address:", placeDetails.address.streetAddress);
console.log("Phone:", placeDetails.contactInfo?.telephone);
console.log("Hours:", placeDetails.hours?.opening);
console.log("Rating:", placeDetails.rating?.user);
Places カテゴリ ID
| カテゴリ | ID |
|---|---|
| 芸術・エンターテインメント | 10000 |
| ビジネス・専門サービス | 11000 |
| 地域・行政 | 12000 |
| 飲食 | 13000 |
| 医療・健康 | 15000 |
| ランドマーク・アウトドア | 16000 |
| 小売 | 17000 |
| スポーツ・レクリエーション | 18000 |
| 旅行・交通 | 19000 |
ジオプロセッサー
ArcGIS Server でカスタムジオプロセシングタスクを実行します。
同期実行
import * as geoprocessor from "@arcgis/core/rest/geoprocessor.js";
const gpUrl =
"https://sampleserver6.arcgisonline.com/arcgis/rest/services/Elevation/ESRI_Elevation_World/GPServer/Viewshed";
const params = {
Input_Observation_Point: new FeatureSet({ features: [pointGraphic] }),
Viewshed_Distance: 15000,
};
const result = await geoprocessor.execute(gpUrl, params);
const outputFeatures = result.results[0].value;
outputFeatures.features.forEach((feature) => {
graphicsLayer.add(
new Graphic({ geometry: feature.geometry, symbol: fillSymbol }),
);
});
非同期実行(長時間実行)
const jobInfo = await geoprocessor.submitJob(gpUrl, params);
// Wait for completion
const completedJobInfo = await jobInfo.waitForJobCompletion({
interval: 2000,
statusCallback: (info) => {
console.log("Status:", info.jobStatus);
},
});
// Fetch results
const resultData = await completedJobInfo.fetchResultData("Result_Layer");
ジオメトリサービス
サーバー側でジオメトリ操作を実行します。
import * as geometryService from "@arcgis/core/rest/geometryService.js";
const geomServiceUrl =
"https://utility.arcgisonline.com/ArcGIS/rest/services/Geometry/GeometryServer";
// Project geometries
const projected = await geometryService.project(geomServiceUrl, {
geometries: [point1, point2],
inSpatialReference: { wkid: 4326 },
outSpatialReference: { wkid: 3857 },
});
// Buffer geometries
const buffered = await geometryService.buffer(geomServiceUrl, {
geometries: [point],
distances: [1000],
unit: "meters",
outSpatialReference: { wkid: 4326 },
});
// Areas and lengths
const result = await geometryService.areasAndLengths(geomServiceUrl, {
polygons: [polygon],
lengthUnit: "meters",
areaUnit: "square-meters",
});
イメージサービス
import * as imageService from "@arcgis/core/rest/imageService.js";
import ImageIdentifyParameters from "@arcgis/core/rest/support/ImageIdentifyParameters.js";
const params = new ImageIdentifyParameters({
geometry: clickPoint,
returnGeometry: true,
returnCatalogItems: true,
});
const result = await imageService.identify(imageServiceUrl, params);
console.log("Pixel value:", result.value);
REST サービスの認証
プレミアムサービス(ルーティング、ジオコーディング、Places)には認証が必要です。
import esriConfig from "@arcgis/core/config.js";
// Set API key globally
esriConfig.apiKey = "YOUR_API_KEY";
// Or register a token for a specific server
import esriId from "@arcgis/core/identity/IdentityManager.js";
esriId.registerToken({
server: "https://route-api.arcgis.com",
token: "YOUR_TOKEN",
});
よくある落とし穴
-
プレミアムサービスの認証漏れ:ルート、Places、ジオコーディングの各サービスには、API キーまたは OAuth トークンが必要です。リクエストを行う前に
esriConfig.apiKeyを設定してください。 -
誤ったパラメータークラスの使用:各 REST サービスには専用のパラメータークラスがあります(例:ルートには
RouteParameters、closestFacility にはClosestFacilityParameters)。誤ったクラスを使用すると、エラーが表示されずに失敗します。 -
outSpatialReference の設定忘れ:結果はデフォルトでサービスの空間参照を使用します。ビューに合わせるため、パラメーターの
outSpatialReferenceは必ず設定してください。const params = new RouteParameters({ stops, outSpatialReference: view.spatialReference, }); -
サービスエラーの未処理:REST 呼び出しは必ず try/catch で囲んでください。
try { const result = await route.solve(routeUrl, routeParams); } catch (error) { if (error.name === "AbortError") { console.log("Request was cancelled"); } else { console.error("Service error:", error.message); } } -
レガシーなタスクパターンの使用:
esri/tasks/*パターンは削除されました。静的関数呼び出しを使う@arcgis/core/rest/*モジュールを使用してください。
ラストマイル配送
集荷・配送の制約を考慮した車両ルーティング問題を解きます。
import * as lastMileDelivery from "@arcgis/core/rest/lastMileDelivery.js";
// Get service description
const serviceDescription =
await lastMileDelivery.getServiceDescription(serviceUrl);
// Solve a vehicle routing problem
const result = await lastMileDelivery.solve(serviceUrl, params);
参照サンプル
route- 停留所間のルート検索directions-routelayer- ルート案内付きのルートレイヤーbasemap-places- POI 検索用の場所検索サービスplaces- 場所の検索と詳細の取得geoprocessing-viewshed- 可視領域解析によるジオプロセシングgeoprocessing-hotspot- ジオプロセシングによるホットスポット解析widgets-print- サーバーサイドのマップ印刷tasks-route- ルート検索タスクtasks-find- マップサービス内のフィーチャーの検索tasks-identify- 指定した位置のフィーチャーの特定tasks-query- サービスからフィーチャーをクエリfind- 属性によるフィーチャーの検索identify- 指定した位置のフィーチャーの特定query- フィーチャーサービスへの REST クエリ
関連スキル
- OAuth と API キーの設定については、
arcgis-authenticationを参照してください。 - FeatureLayer クエリ(サーバー側およびクライアント側)については、
arcgis-layersを参照してください。 - クライアント側のジオメトリー操作については、
arcgis-geometry-operationsを参照してください。 - 解析オブジェクトとフィーチャー削減については、
arcgis-spatial-analysisを参照してください。