Skip to content

Commit 95e54bc

Browse files
[fix]无人机视频名字调整 淮南例子调整
AI-GEN: 70% Cursor
1 parent 16b6ee8 commit 95e54bc

4 files changed

Lines changed: 118 additions & 70 deletions

File tree

‎examples/mapboxgl/config.js‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1883,22 +1883,22 @@ var exampleConfig = {
18831883
fileName: 'videoMap'
18841884
},
18851885
{
1886-
name: '无人机视频',
1887-
name_en: 'UAV video',
1886+
name: '无人机视频图层',
1887+
name_en: 'UAV Video Layer',
18881888
version: '11.2.0',
18891889
thumbnail: 'videoLayerWithTime.png',
18901890
fileName: 'videoLayerWithTime'
18911891
},
18921892
{
1893-
name: '动态视频地图',
1894-
name_en: 'Dynamic Video Map',
1893+
name: '无人机视频地图',
1894+
name_en: 'UAV Video Map',
18951895
version: '12.1.1',
18961896
thumbnail: 'videoMapWithTime.png',
18971897
fileName: 'videoMapWithTime'
18981898
},
18991899
{
1900-
name: '动态视频地图标绘对比',
1901-
name_en: 'Dynamic Video Map Draw Compare',
1900+
name: '视频标绘',
1901+
name_en: 'Video Map Draw',
19021902
version: '12.1.1',
19031903
thumbnail: 'videoMapWithTimeDraw.png',
19041904
fileName: 'videoMapWithTimeDraw'

‎examples/mapboxgl/videoMapWithTimeDraw.html‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@
105105
var lastVideoExtentTime;
106106
var tk = '1d109683f4d84198e37a38c442d68311';
107107
var attribution =
108-
"© <a href='https://www.tianditu.gov.cn' target='_blank'>天地图</a>" +
108+
"© <a href='https://www.tianditu.gov.cn' target='_blank'>" + resources.title_3tianditu + "</a>" +
109109
" with <span>© <a href='https://iclient.supermap.io' target='_blank'>SuperMap iClient</a></span> ";
110110

111111
initRealMap();

‎examples/mapboxgl/videoMapWithTime_huainan.html‎

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,6 @@
4646
var count = 0;
4747
var dynamicLayerIds = [];
4848

49-
function resolveVideoUrl(address) {
50-
if (!address) {
51-
return address;
52-
}
53-
if (/^https?:\/\//i.test(address)) {
54-
return address;
55-
}
56-
return host + (address.charAt(0) === '/' ? address : '/' + address);
57-
}
58-
5949
function queryFeatures(datasetName) {
6050
var sqlParam = new mapboxgl.supermap.GetFeaturesBySQLParameters({
6151
queryParameter: {
@@ -144,7 +134,7 @@
144134
};
145135
});
146136
videoMap = new mapboxgl.supermap.VideoMap({
147-
url: resolveVideoUrl(feature.properties.address),
137+
url: feature.properties.address,
148138
videoParameters: parameters,
149139
interval: 0.1
150140
});

‎examples/mapboxgl/videoMapWithTime_huainanDraw.html‎

Lines changed: 110 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@
139139
};
140140
var VIDEO_DRAW_SOURCE_ID = 'huainan-video-draw-sync';
141141
var REAL_VIDEO_DRAW_SOURCE_ID = 'huainan-real-video-draw-sync';
142-
var VIDEO_FOOTPRINT_SOURCE_ID = 'huainan-video-footprint';
142+
var VIDEO_BOUNDS_SOURCE_ID = 'huainan-video-bounds';
143143
var videoMap;
144144
var map;
145145
var mapDraw;
@@ -149,19 +149,14 @@
149149
var dynamicLayerIds = [];
150150
var measurementMarkers = {};
151151
var uploadedDatasetRefreshVersions = {};
152+
// 天地图标绘要素 id -> 服务端 SmID,用于删除时定位已上传的要素
153+
var mapDrawSmIDs = {};
152154
var mapBearing = 214;
153155
var tk = '1d109683f4d84198e37a38c442d68311';
154156
var attribution =
155157
"© <a href='https://www.tianditu.gov.cn' target='_blank'>天地图</a>" +
156158
" with <span>© <a href='https://iclient.supermap.io' target='_blank'>SuperMap iClient</a></span> ";
157159

158-
function resolveVideoUrl(address) {
159-
if (!address || /^https?:\/\//i.test(address)) {
160-
return address;
161-
}
162-
return host + (address.charAt(0) === '/' ? address : '/' + address);
163-
}
164-
165160
function initMap() {
166161
map = new mapboxgl.Map({
167162
container: 'map',
@@ -185,7 +180,7 @@
185180
{ id: 'tianditu-cia', type: 'raster', source: 'tianditu_cia', minzoom: 0, maxzoom: 18 }
186181
]
187182
},
188-
center: [116.84922, 32.5758765],
183+
center: [116.8500991647519, 32.577504319585],
189184
zoom: 16,
190185
bearing: mapBearing,
191186
pitch: 4.5,
@@ -196,47 +191,55 @@
196191
displayControlsDefault: false,
197192
controls: { point: true, line_string: true, polygon: true, trash: true }
198193
});
194+
window.map = map;
199195
map.addControl(mapDraw, 'top-left');
200196
map.addControl(new mapboxgl.supermap.LogoControl({ link: 'https://iclient.supermap.io' }), 'bottom-right');
201197
['draw.create', 'draw.update', 'draw.delete', 'draw.render'].forEach(function (eventName) {
202198
map.on(eventName, syncMapDraw);
203199
});
200+
// 天地图上的新增标绘同样上传到 iServer,并支持删除
201+
map.on('draw.create', function (event) {
202+
(event.features || []).forEach(uploadMapDrawFeature);
203+
});
204+
map.on('draw.delete', function (event) {
205+
(event.features || []).forEach(deleteMapDrawFeature);
206+
});
204207
map.on('load', function () {
205208
mapReady = true;
206209
Object.keys(pendingRealSources).forEach(function (sourceId) {
207210
var pending = pendingRealSources[sourceId];
208211
addOrUpdateRealSource(sourceId, pending.data, pending.color);
209212
});
210213
pendingRealSources = {};
211-
updateVideoFootprint();
214+
updateVideoBounds();
212215
});
213216
}
214217

215-
function updateVideoFootprint() {
218+
function updateVideoBounds() {
216219
if (!videoMap || !mapReady || !videoMap.getVideoBounds) {
217220
return;
218221
}
219-
var footprint = videoMap.getVideoBounds();
220-
if (!footprint) {
222+
var bounds = videoMap.getVideoBounds();
223+
if (!bounds) {
221224
return;
222225
}
223-
var featureCollection = { type: 'FeatureCollection', features: [footprint] };
224-
var source = map.getSource(VIDEO_FOOTPRINT_SOURCE_ID);
226+
var featureCollection = { type: 'FeatureCollection', features: [bounds] };
227+
var source = map.getSource(VIDEO_BOUNDS_SOURCE_ID);
225228
if (source) {
226229
source.setData(featureCollection);
227230
return;
228231
}
229-
map.addSource(VIDEO_FOOTPRINT_SOURCE_ID, { type: 'geojson', data: featureCollection });
232+
map.addSource(VIDEO_BOUNDS_SOURCE_ID, { type: 'geojson', data: featureCollection });
230233
map.addLayer({
231-
id: VIDEO_FOOTPRINT_SOURCE_ID + '-fill',
234+
id: VIDEO_BOUNDS_SOURCE_ID + '-fill',
232235
type: 'fill',
233-
source: VIDEO_FOOTPRINT_SOURCE_ID,
236+
source: VIDEO_BOUNDS_SOURCE_ID,
234237
paint: { 'fill-color': '#f59e0b', 'fill-opacity': 0.08 }
235238
});
236239
map.addLayer({
237-
id: VIDEO_FOOTPRINT_SOURCE_ID + '-outline',
240+
id: VIDEO_BOUNDS_SOURCE_ID + '-outline',
238241
type: 'line',
239-
source: VIDEO_FOOTPRINT_SOURCE_ID,
242+
source: VIDEO_BOUNDS_SOURCE_ID,
240243
paint: { 'line-color': '#f59e0b', 'line-width': 2, 'line-dasharray': [2, 1] }
241244
});
242245
}
@@ -427,48 +430,84 @@
427430
updateMeasurementMarkers('video-draw-video', videoMap, featureCollection, true);
428431
}
429432

430-
function uploadVideoDrawFeature(feature) {
433+
function resolveDatasetPath(feature) {
431434
if (!feature || !feature.geometry) {
432-
return;
435+
return null;
433436
}
434437
var targetUrl = datasetUrl[feature.geometry.type];
435438
if (!targetUrl) {
436-
return;
439+
return null;
437440
}
438-
var datasetPath = targetUrl.match(/^(.*)\/datasources\/([^/]+)\/datasets\/([^/?#]+)\/?$/);
441+
return targetUrl.match(/^(.*)\/datasources\/([^/]+)\/datasets\/([^/?#]+)\/?$/);
442+
}
443+
444+
function uploadServerFeature(feature, onSuccess) {
445+
var datasetPath = resolveDatasetPath(feature);
439446
if (!datasetPath) {
440447
return;
441448
}
442449
var editFeaturesService = new mapboxgl.supermap.FeatureService(datasetPath[1]);
443450
var editFeaturesParams = new mapboxgl.supermap.EditFeaturesParameters({
444-
features: feature,
451+
features: [feature],
445452
dataSourceName: decodeURIComponent(datasetPath[2]),
446453
dataSetName: decodeURIComponent(datasetPath[3]),
447454
editType: 'add',
448455
returnContent: true
449456
});
450457
editFeaturesService.editFeatures(editFeaturesParams).then(function (serviceResult) {
451-
if (!serviceResult || !serviceResult.result || !serviceResult.result.succeed) {
458+
var result = serviceResult && serviceResult.result;
459+
if (!result || result.succeed === false) {
452460
return;
453461
}
462+
// returnContent 为 true 时返回新建要素的 ID 数组,回填 SmID 以便删除时定位服务端要素
463+
var SmID = Array.isArray(result) ? result[0] : result.SmID;
464+
if (SmID != null && onSuccess) {
465+
onSuccess(SmID);
466+
}
454467
refreshUploadedDataset(decodeURIComponent(datasetPath[3]));
455468
}).catch(function (error) {
456469
console.error('视频标绘上传失败:', error);
457470
});
458471
}
459472

460-
function deleteUploadedFeature(feature) {
461-
if (!feature || !feature.geometry) {
462-
return;
473+
function uploadVideoDrawFeature(feature, drawFeature) {
474+
uploadServerFeature(feature, function (SmID) {
475+
if (drawFeature) {
476+
drawFeature.properties = drawFeature.properties || {};
477+
drawFeature.properties.SmID = SmID;
478+
}
479+
});
480+
}
481+
482+
function uploadMapDrawFeature(feature) {
483+
uploadServerFeature(feature, function (SmID) {
484+
if (feature.id != null) {
485+
mapDrawSmIDs[String(feature.id)] = SmID;
486+
}
487+
});
488+
}
489+
490+
function getFeatureSmID(feature) {
491+
if (!feature) {
492+
return null;
463493
}
464-
var targetUrl = datasetUrl[feature.geometry.type];
465-
if (!targetUrl) {
494+
var properties = feature.properties || {};
495+
return properties.SmID != null ? properties.SmID : properties.SMID;
496+
}
497+
498+
function deleteUploadedFeature(feature, SmID) {
499+
var datasetPath = resolveDatasetPath(feature);
500+
if (!datasetPath) {
466501
return;
467502
}
468-
var datasetPath = targetUrl.match(/^(.*)\/datasources\/([^/]+)\/datasets\/([^/?#]+)\/?$/);
469-
if (!datasetPath) {
503+
if (SmID == null) {
504+
SmID = getFeatureSmID(feature);
505+
}
506+
if (SmID != null) {
507+
deleteServerFeature(datasetPath, SmID);
470508
return;
471509
}
510+
// 未记录 SmID(如上传播报未返回)时,按几何从服务端反查后再删除
472511
var dataset = decodeURIComponent(datasetPath[3]);
473512
var sqlParam = new mapboxgl.supermap.GetFeaturesBySQLParameters({
474513
queryParameter: { name: dataset + '@' + dataSourceName },
@@ -484,25 +523,41 @@
484523
if (!serverFeature || serverFeature.id == null) {
485524
return;
486525
}
487-
var editFeaturesParams = new mapboxgl.supermap.EditFeaturesParameters({
488-
dataSourceName: decodeURIComponent(datasetPath[2]),
489-
dataSetName: dataset,
490-
IDs: [serverFeature.id],
491-
editType: 'delete',
492-
returnContent: true
493-
});
494-
return new mapboxgl.supermap.FeatureService(datasetPath[1])
495-
.editFeatures(editFeaturesParams)
496-
.then(function (deleteResult) {
497-
if (deleteResult && deleteResult.result && deleteResult.result.succeed) {
498-
refreshUploadedDataset(dataset);
499-
}
500-
});
526+
deleteServerFeature(datasetPath, serverFeature.id);
501527
}).catch(function (error) {
502528
console.error('视频标绘删除失败:', error);
503529
});
504530
}
505531

532+
function deleteMapDrawFeature(feature) {
533+
var featureId = feature && feature.id != null ? String(feature.id) : null;
534+
var SmID = featureId != null ? mapDrawSmIDs[featureId] : null;
535+
if (featureId != null) {
536+
delete mapDrawSmIDs[featureId];
537+
}
538+
deleteUploadedFeature(feature, SmID);
539+
}
540+
541+
function deleteServerFeature(datasetPath, SmID) {
542+
var editFeaturesParams = new mapboxgl.supermap.EditFeaturesParameters({
543+
dataSourceName: decodeURIComponent(datasetPath[2]),
544+
dataSetName: decodeURIComponent(datasetPath[3]),
545+
IDs: [SmID],
546+
editType: 'delete',
547+
returnContent: true
548+
});
549+
new mapboxgl.supermap.FeatureService(datasetPath[1])
550+
.editFeatures(editFeaturesParams)
551+
.then(function (deleteResult) {
552+
if (deleteResult && deleteResult.result && deleteResult.result.succeed) {
553+
refreshUploadedDataset(decodeURIComponent(datasetPath[3]));
554+
}
555+
})
556+
.catch(function (error) {
557+
console.error('视频标绘删除失败:', error);
558+
});
559+
}
560+
506561
function updateMeasurementMarkers(prefix, targetMap, featureCollection, projectToVideo) {
507562
if (!targetMap || !featureCollection) {
508563
return;
@@ -597,7 +652,7 @@
597652
map.jumpTo({ center: initialCenter, zoom: 16, bearing: mapBearing });
598653
videoMap = new mapboxgl.supermap.VideoMap({
599654
container: 'videoMap',
600-
url: resolveVideoUrl(feature.properties.address),
655+
url: feature.properties.address,
601656
videoParameters: parameters,
602657
interval: 0.1
603658
});
@@ -660,21 +715,24 @@
660715
});
661716
videoMap.on('drawcreate', function (event) {
662717
syncVideoDraw(event.data || videoMap.getDrawData());
663-
uploadVideoDrawFeature(event.feature);
718+
var selectedFeatures = videoMap.getDrawSelected().features;
719+
uploadVideoDrawFeature(event.feature, selectedFeatures[0]);
664720
});
665721
videoMap.on('drawdelete', function (event) {
666722
syncVideoDraw(event.data || videoMap.getDrawData());
667-
(event.features || []).forEach(deleteUploadedFeature);
723+
(event.features || []).forEach(function (feature) {
724+
deleteUploadedFeature(feature);
725+
});
668726
});
669727
videoMap.on('drawclear', function () {
670728
syncVideoDraw({ type: 'FeatureCollection', features: [] });
671729
});
672730
videoMap.on('videoparameterupdate', function () {
673731
updateMeasurementMarkers('video', videoMap, mapDraw.getAll(), true);
674732
updateMeasurementMarkers('video-draw-video', videoMap, videoMap.getDrawData(), true);
675-
updateVideoFootprint();
733+
updateVideoBounds();
676734
});
677-
updateVideoFootprint();
735+
updateVideoBounds();
678736
videoMap.on('mousemove', function (event) {
679737
var hits = dynamicLayerIds.length
680738
? videoMap.queryRenderedFeatures(event.point, { layers: dynamicLayerIds })

0 commit comments

Comments
 (0)