前言
網上關於GeoScene及GeoScene API for JavaScript的資料太少了,官方的技術支援又太慢了,最近把在專案中踩過的坑分享出來;
**版本資訊**
GeoScene Pro 4.0
GeoScene Enterprise 3.1
GeoScene API for JavaScript 4.27.4
一、建立網路分析圖層
1、在地理資料庫中新建要素資料集
右擊地理資料庫 -> 新建 -> 要素資料集 -> 輸入要素資料集名稱、座標系 -> 建立
2、匯入路網要素類
右擊要素資料集 -> 匯入 -> 要素類 -> 選擇路網shp檔案 -> 匯入
可以將匯入的要素類載入的地圖中檢查一下,是否存在問題
3.建立網路資料集
右擊要素資料集 -> 新建 -> 網路資料集 -> 填寫名稱、勾選要素類(這裡高層模型沒玩明白,自行研究吧) -> 執行
然後要素資料集中就會增加兩個(一個是網路資料集、一個是交匯點),網路資料集也會載入到地圖中去
4、設定網路資料集並構建
右鍵剛建立的網路資料集 -> 常規 -> 服務區索引-> 源設定 -> 組連通性 -> 策略修改為任意節點(預設是端點,但是我的路網不是很規範,會導致分析出來的結果有點問題,所以我就修改為這樣了);修改後儲存
右擊網路資料集 -> 選擇構建 -> 執行,等待執行結束
分析 -> 網路分析 -> 路徑,這樣就會生成一個路線/路徑圖層組,
二、桌面端測試網路分析服務
選擇路線/路徑圖層組 -> 路徑圖層 -> 建立要素 -> 建立停靠點、點障礙、線障礙等要素
這裡我建立了三個停靠點和一條障礙線,建立完成後點選執行分析路線
三、釋出服務
圖層組重新命名(geoscene pro預設生成圖層組的名稱是中文的而且存在斜槓,後面使用過程中會有問題,所以我們需要手動修改)
選擇共享 -> 填寫名稱、摘要、標籤 -> 如果你的資料來源註冊到伺服器上了,資料和圖層型別可以選擇引用,地圖服務;我這裡因為是檔案資料庫,沒註冊,所以選擇的複製 -> 一定要切換到配置頁面勾選網路分析 -> 然後點選分析、釋出,等待發布完成
釋出服務之前記得提前連線門戶並登入,然後將門戶設定為活動門戶
釋出成功後就可以在門戶中看到
四、JS呼叫
這個我直接貼程式碼吧,邏輯很簡單
<!--
* @Author: xuhanchi
* @Date: 2024-06-18 11:01:14
* @LastEditors: TanXJ
* @LastEditTime: 2024-08-02 16:59:41
* @Description: 最短路徑分析
-->
<template>
<div id="viewDiv"></div>
</template>
<script setup>
import { ref, reactive, onMounted } from "vue"
import Map from "@geoscene/core/Map"
import SceneView from "@geoscene/core/views/SceneView"
import WebTileLayer from "@geoscene/core/layers/WebTileLayer"
import FeatureLayer from "@geoscene/core/layers/FeatureLayer"
import Collection from "@geoscene/core/core/Collection"
import Stop from "@geoscene/core/rest/support/Stop"
import * as route from "@geoscene/core/rest/route"
import Graphic from "@geoscene/core/Graphic"
import RouteParameters from "@geoscene/core/rest/support/RouteParameters"
let view = null
onMounted(() => {
initView()
})
// 初始化場景
const initView = () => {
view = new SceneView({
map: new Map(),
container: "viewDiv",
camera: {
position: {
x: 114.356454,
y: 30.546360,
z: 40000
}
}
})
// Google影像地圖
const googleLayer = new WebTileLayer({
urlTemplate: "https://mt3.google.com/vt/lyrs=s&x={x}&y={y}&z={z}",
subDomains: ["mt0", "mt1", "mt2", "mt3"]
})
view.map.add(googleLayer)
// 載入路網圖層
const featureLayer = new FeatureLayer({
url: "/server/rest/services/roads_analyze/MapServer/6",
renderer: {
type: "simple",
symbol: {
type: "simple-line",
width: 2,
style: "solid",
color: "#FFAA00"
}
}
})
view.map.add(featureLayer)
// 最短路徑分析
const routeParams = new RouteParameters({
stops: new Collection([
new Stop({ geometry: { x: 114.168312, y: 30.538078 } }),
new Stop({ geometry: { x: 114.260126, y: 30.558536 } }),
new Stop({ geometry: { x: 114.250880, y: 30.520646 } }),
new Stop({ geometry: { x: 114.287516, y: 30.510952 } }),
new Stop({ geometry: { x: 114.297802, y: 30.421159 } }),
new Stop({ geometry: { x: 114.396715, y: 30.460172 } }),
new Stop({ geometry: { x: 114.396303, y: 30.502812 } })
])
})
// 建立點、文字
routeParams.stops.items.forEach((element, key) => {
const pointGraphic = new Graphic({
geometry: element.geometry,
symbol: {
type: 'simple-marker',
style: 'circle',
color: 'red',
size: '20px'
}
})
view.graphics.add(pointGraphic)
const textGraphic = new Graphic({
geometry: element.geometry,
symbol: {
type: 'text',
color: "white",
text: key
}
})
view.graphics.add(textGraphic)
});
// 分析路徑
route.solve("/server/rest/services/roads_analyze/NAServer/testroad", routeParams).then((routeSolveResult) => {
let geometry = routeSolveResult.routeResults[0].route.geometry
var pathGraphic = new Graphic({
geometry: geometry,
symbol: {
type: 'simple-line',
color: 'red',
width: '4px',
style: 'solid'
}
})
view.graphics.add(pathGraphic)
})
}
</script>
<style lang="scss" scoped>
#viewDiv {
width: 100%;
height: 100%;
}
</style>
最終實現效果: