可更新 GeoJSON 图源
人工绘制与逐顶点编辑使用独立数字图层的绘制与编辑 API,包含会话、吸附、追踪与撤销重做。
共同门面采用 addSource / getSource / removeSource / isSourceLoaded,以及源的 setData / updateData / getData。getSource 和数据读写统一 await,适用于跨线程宿主。登记图源不自动添加显示图层;使用 GeoJSON 样式图层 绑定 circle/line/fill 显示,既有 GIS 图源/图层接口继续兼容,不能把两种登记直接当作同一源。
import { map } from 'sqsmap';
map.addSource('trees', {type:'geojson', data:{type:'FeatureCollection',features:[]}});
const trees = await map.getSource('trees');
await trees.setData({type:'Feature', id:'oak', properties:{height:12}, geometry:{type:'Point',coordinates:[116.4,39.9]}});
await trees.updateData({update:[{id:'oak',addOrUpdateProperties:[{key:'height',value:15}]}]});
const data = await trees.getData();
map.removeSource('trees');
await map.sqs.flush();
每个源句柄含公开 id 和不复用的 sourceInstanceId。setData 改数据修订,保留实例;移除后同名重建产生新实例,旧句柄读写均返回 STALE_HANDLE。数据更换不改变相机或图层顺序。原始 GeoJSON 及 f64 坐标保持,promoteId 只指定显示/增量身份,getData 不偷偷改写原始 id。generateId 覆盖显示身份为要素位置编号,只支持整体数据替换。
updateData 要求全部原要素具有唯一显式 ID 或 promoteId;数字与字符串身份不同。按 removeAll/remove、add、update 的顺序处理;重复添加身份替换其数据,未知移除/更新身份忽略。支持 newGeometry(含 null)、removeAllProperties、removeProperties 与 addOrUpdateProperties。无效几何、身份或超预算更新保留旧数据和修订。空集合、null 几何及无坐标集合允许,空范围为 null。经纬度分别限于 ±180、±90,坐标可含高度。
核心/C ABI/WASM SDK 每源 16 MiB JSON、5 万原要素、50 万位置,每图 128 源、64 MiB 原始 JSON、128 MiB 源驻留数据。共同脚本参数另受每参数 4096 节点、32 层和宿主 64 KiB 请求/响应限制;原生脚本也保留 64 KiB 队列限制,大源优先 C ABI / SDK 管理。已接通内存与 HTTP(S) GeoJSON、共同 Point 聚合(见点聚合指南);image/video/canvas和共同raster瓦片已接通,完整vector瓦片类型/DEM和其余样式类型继续实施;内存 GeoJSON 的 circle/line/fill 已接通。
桌面、网站与独立原生持续会话均转发图源数量和 GeoJSON 加载事件,网站需要匹配 SDK/WASM。共同 Point 聚合使用同一脚本在原生/应用 QuickJS、浏览器主线程/严格 Worker 验证实际显示与查询,见点聚合指南。本机软件渲染结果不替代 Windows/macOS、硬件 WebGPU 或移动设备验收;移动应用宿主仍未接入,明确 CAPABILITY_UNAVAILABLE。
参考 GeoJSONSource、增量结构 与要素变更。仅参考接口描述,实现由 SqsMap 自有核心提供。
集合几何的属性/身份复制在解码前保守估算,低于原始字节或数量上限的数据也可能因展开预算被拒绝;驻留限额不表示整个宿主进程的峰值内存。
图源变更监听
桌面、网页和原生持续脚本可监听 sqs.sourceschange。每次成功的注册、删除或数据更新产生一个 sourceCount 快照,代表已登记源的数量;更新数据时数量可以不变。查询和失败写入不产生该事件,事件不代表显示图层或网络/绘制已经完成。sequence 与 mapInstanceId 确定地图内事件顺序和身份。停止会话取消所有监听;移动宿主尚未接通。
import {map} from 'sqsmap';
export const sessionMode = 'persistent';
const subscription = map.on('sqs.sourceschange', event => console.log(event.sourceCount));
// subscription.unsubscribe();
独立浏览器 SDK 使用 view.onSourcesChange(listener) 或 view.on('sources', listener),返回取消函数。快照不可修改;32 个监听、128 个待发送变更为上限,队列满在写入前拒绝。监听器异常记录日志,不撤销已提交写入。SDK 回调不提供脚本会话的 target/sequence;共同脚本宿主补齐它们。旧 npm SDK 无观察入口时 map.sqs.events() 不声明该事件,不伪装已支持。C 原生事件保留 state 全快照,原生 JS 同时提供共同的顶层 sourceCount。
操作屏障不等待监听回调完成;需要消费某次通知时,在写入前创建 map.once('sqs.sourceschange'),并等待该 Promise 后再取消监听。
实时图源批次
共同实时点源使用 addSource 的 sqsLive 配置,fields 声明 string/number/boolean 字段,allowDelta 默认为 false。初始数据须为空 FeatureCollection;不能使用 URL、promoteId/generateId。source.sqs 的 LiveSourceAPI 包含下列接口:
source.sqs.applyLiveUpdate(frame: LiveUpdate): Promise<LiveUpdateResult>
source.sqs.getLiveState(): Promise<LiveSourceState>
source.sqs.freezeLiveSnapshot(): Promise<LiveSourceSnapshot>
协议使用十进制 u128 sequence 字符串;重复上一批次返回 applied:false。协议、图源、聚合与显示原子提交,失败保留上一份数据。sourcedata.sqsLive 是不可变的历史状态。普通 setData/updateData 对实时源返回 CONFLICT,旧句柄返回 STALE_HANDLE,未配置源返回 CAPABILITY_UNAVAILABLE。每批4096点/8MiB,脚本响应另受64KiB限制;独立冻结副本修改不影响地图。完整约束、示例、SDK liveSourceUpdates 和 C SQSM_MAP_LIVE_UPDATES 标志见实时图源批次。手动批次、HTTP轮询与WebSocket入口已接通;接收器场景归属已接通,静态GeoJSON归属已接通;playback/轨迹与移动宿主继续待实现。
HTTP 实时接收器
共同图源支持 source.sqs.connectLive({protocol:'gis-live-v1',transport:{type:'http-poll',url,intervalMs:2000}})。返回身份绑定的接收器,getState/pause/resume/stop 均需 await;getLiveReceiver() 不存在时返回 undefined。间隔500..60000ms,每图8个活动或暂停接收器;pause/stop取消在途,stop保留数据,旧身份 STALE_HANDLE。活动或暂停时手动 applyLiveUpdate 返回 CONFLICT。历史事件可含 sqsLiveReceiver,不含URL/凭据。HTTP错误保留旧数据后重试;重复HTTP完成有 sourcedata 但不推进数据修订。接收器归地图/源,脚本退出不自动停止。详见官网中英文 live-http 的预算、C资源泵、状态、事件与完整HTML。WebSocket已另行接通;静态GeoJSON归属已接通;playback/轨迹/mobile仍待接入。
WebSocket 实时接收器
共同 source.sqs.connectLive 另支持 transport:{type:"websocket",url,reconnectDelayMs:2000}。首帧须 snapshot,重连、暂停、错误恢复与有界排队见 WebSocket 实时接收器。每图8个接收器、8数据帧/16MiB队列,二进制明确拒绝;核心/C资源通道不增加网络依赖。scene/mobile 外机验收继续按任务表推进。
共同场景与接收器归属
用 map.sqs.scenes.create({id,name?}) 创建草稿;get(id) 返回当前句柄或 undefined,list() 返回不可变小快照。句柄包含 id/sceneInstanceId 与需要 await 的 getState/start/pause/resume/stop;remove(scene) 停止归属接收器、释放场景身份并保留图源数据。connectLive 选项可带 owner:scene(桥接提取身份),同名重建或跨地图身份会 STALE_HANDLE。
草稿不启动联网。场景 pause 与接收器主动 pause 分开保存,场景 resume 不复活主动暂停/停止的接收器;owner 未运行时 receiver.resume 为 CONFLICT。stop 是终态。地图持有场景和连接,脚本退出不会隐式停止。监听 sqs.scenechange(reason、不可变 scene 历史快照)和图源事件中的 owner/ownerState;控制完成不代表数据就绪。
await map.sqs.getCapabilities() 读取已实现能力:sceneLifecycle/sceneReceiverOwnership 为 true;sceneStaticResources 为 true;scenePlayback/sceneRoutePlayback/sceneLinePlayback/sceneTracks 为 true。最多16场景、每图8活动/暂停接收器,草稿也计接收器配额;列表、事件和控制有界,控制失败不改变任何归属接收器。旧桌面 map.scenes 保留兼容范围。完整说明见共同场景。
静态场景:await scene.attachSource(await map.getSource(id)) / scene.detachSource(source)。sources冻结身份列表,草稿/停止隐藏、暂停保留显示、remove恢复用户layout;所有同源共同样式图层、渲染查询和署名使用相同有效显隐。详见静态场景。
共同场景时钟
await scene.getClock() 返回只读 {id,sceneInstanceId,state,elapsedMs}。草稿0,运行累计单调毫秒,暂停/停止冻结,恢复不重置;纯读不产生事件或写入水位。脚本退出不暂停。运行计入宿主后台单调间隔,系统睡眠遵循平台时钟。sceneClock:true 不代表播放/轨迹已实现,旧桌面 map.scenes 仍是兼容入口。完整示例见场景时钟。
独立SDK首选map.on('sqs.sourceschange', listener),旧sources别名仍可取消同一监听,见事件名称。
共同vector/raster源登记、元数据状态和setTiles/setUrl已接通;raster共同图层支持平面/倾斜/球面、排序、显隐、opacity和tileState。vector共同circle/line/fill和source-layer查询也已接通,其余类型、DEM及要素状态仍待实现。见共同影像瓦片图层。
共同 MVT 图层与查询
vector图源现在通过标准addSource/addLayer显示circle、line、fill,图层必须指定source-layer。同一源的多层共享下载和缓存;平面、倾斜和球面使用共同绘制数据。二维绘制按逻辑图层顺序交错面/线/点,moveLayer可以把面移到点上方,空间格裁剪及LOD继续使用。
import {map} from 'sqsmap';
map.addSource('roads',{type:'vector',tiles:['https://your-server.example/{z}/{x}/{y}.pbf'],attribution:'Your provider'});
map.addLayer({id:'roads-line',type:'line',source:'roads','source-layer':'transportation',paint:{'line-color':'#e87925','line-width':3}});
await map.sqs.flush({render:true});
console.log(await map.querySourceFeatures('roads',{sourceLayer:'transportation'}));
请求和取消沿用共同瓦片调度,支持TileJSON、setTiles/setUrl、XYZ/TMS、世界副本与来源声明。每响应8MiB MVT;每瓦片32个子层、5万要素、50万顶点。每图最多64个可见瓦片、32个待处理请求、64MiB解码瓦片缓存;可见源数据另受16MiB JSON、5万要素、50万坐标及地图源驻留预算限制。超预算明确失败,更新失败保留旧图。当前不做父子补位,也不把缓存内未显示的瓦片加入查询。
querySourceFeatures要求sourceLayer;queryRenderedFeatures按图层筛选并返回sourceLayer、原MVT id和属性,坐标为WGS84,经度包括可见世界副本。原生/共同脚本读操作使用await;同一个要素跨瓦片或世界副本可能出现多次。GeoJSON、媒体源不可传source-layer。metadataLoaded是元数据状态,tileState和loaded描述当前视图的实际就绪情况。
能力vectorTileSourceStore为true仅代表上述MVT子集,不表示完整矢量样式兼容。共同symbol、fill-extrusion等其它类型、缓冲几何的瓦片边界裁剪、MLT、promoteId、volatile、父子补位和移动宿主仍待接通。现有setStyle(URL)底图的能力保持其独立文档范围。
完整HTML含全部按钮、查询、署名及销毁;共同验收脚本使用本地生成MVT,通过真实原生QuickJS和WASM主线程/严格Worker。真实服务须替换模板并展示提供方要求的署名。
MVT要素状态已由07.9接通,详见要素状态。
13.6c已接通GeoJSON、TileJSON和配准图片/视频源的自定义URI及URL更新,保留原解码/取消/身份规则,见图源协议。Style/glyph/loadImage/实时协议入口继续各自范围。