openlayers加载arcgis的VectorTileServer服务图层

openlayers加载arcgis的VectorTileServer服务图层

url示例:http://127.0.0.1/arcgis/rest/services/Hosted/JCDLDT_YX_2K/VectorTileServer

js 复制代码
    /**
     * 加载ArcGis矢量瓦片
     * @param options
     */
    public async loadArcGisVectorTileLayer(options: IaddArcgisLayerConfig) {
        const metadata = await fetch(`${options.url}?f=pjson`).then((r) => r.json());

        const tileGrid: any = this.buildTileGridFromArcGIS(metadata);

        console.log('Full metadata:', metadata);
        console.log('Styles:', metadata.styles); // 查看 styles 信息

        const source = new VectorTileSource({
            format: new MVT(),
            url: `${options.url}/tile/{z}/{y}/{x}.pbf`,
            tileGrid,
            // projection: `EPSG:${metadata.fullExtent.spatialReference.wkid}`,
            projection: `EPSG:4490`,
            wrapX: true,
        });

        const layer = new VectorTileLayer({
            source,
            zIndex: options.index,
        });

        layer.setProperties({
            id: options.layerId,
            group: options.group,
            record: options,
        });

        console.log(layer, 'layer');

        this.map.addLayer(layer);

        // 加载并应用样式
        const styleJson = await fetch(`${options.url}/resources/styles/root.json`).then(r => r.json());

        // 修正样式中的资源路径
        if (styleJson.sprite) {
            styleJson.sprite = `${options.url}/resources/sprites/sprite`;
        }

        if (styleJson.glyphs) {
            styleJson.glyphs = `${options.url}/resources/fonts/{fontstack}/{range}.pbf`;
        }
        if (styleJson.sources?.esri) {
            delete styleJson.sources.esri.url;
            styleJson.sources.esri.tiles = [`${options.url}/tile/{z}/{y}/{x}.pbf`];
            styleJson.sources.esri.tileSize = 512;
        }

        // 构建切片网格
        const resolutions = metadata.tileInfo.lods
            .sort((a, b) => a.level - b.level)
            .map(lod => lod.resolution);

        await applyStyle(layer, styleJson, "esri", { resolutions });
    }



   /**
    * 根据 ArcGIS VectorTileServer 的 pjson 构建 OpenLayers TileGrid
    */
    public buildTileGridFromArcGIS(metadata: any): TileGrid {

        if (!metadata?.tileInfo) {
            throw new Error('ArcGIS VectorTileServer 元数据缺少 tileInfo');
        }

        const tileInfo = metadata.tileInfo;
        const fullExtent = metadata.fullExtent;

        // extent
        const extent: [number, number, number, number] = [
            fullExtent.xmin,
            fullExtent.ymin,
            fullExtent.xmax,
            fullExtent.ymax,
        ];

        // origin
        const origin: [number, number] = [
            tileInfo.origin.x,
            tileInfo.origin.y,
        ];

        const tileSize: number = tileInfo.cols;

        // resolutions 直接使用 metadata 中的值
        const resolutions: number[] = tileInfo.lods
            .sort((a: any, b: any) => a.level - b.level)
            .map((lod: any) => lod.resolution);

        return new TileGrid({
            extent,
            origin,
            tileSize,
            resolutions,
        });
    }

创建4490经纬度地图

js 复制代码
const mapDiv: any = document.querySelector('.mapDiv');
    const projection = new Projection({
      code: `EPSG:4490`,
      units: 'degrees',
      global: false, // 是否全局
    });
    this.projection = projection;
    const map = new Map({
      target: mapDiv,
      layers: [],
      view: new View({
        projection,
        minZoom: 6,
        maxZoom: 21,
        center: [102, 25], // 云南中心点附近
        zoom: 8,
        // 关闭无级缩放地图
        smoothResolutionConstraint: true,
        // 设置边界范围
        extent: [98, 20.5, 106, 30],
        // 确保地图中心点不能移动到边界外
        constrainOnlyCenter: true,
      }),
      controls: [],
    });
相关推荐
GIS地信小匠12 小时前
(21)ArcGIS Pro 矢量拆分与相交分析:按属性 / 位置拆分 + 重叠提取全攻略
arcgis·空间分析·数据处理·gis教程·arcgls pro
GIS地信小匠12 小时前
(25)ArcGIS Pro 要素字段融合、分配面:面要素空间编辑攻略
arcgis·空间分析·数据处理·gis教程·arcgls pro
FlDmr4i2816 小时前
ArcGIS授权管理器断网后自动停止
网络·arcgis
2401_8638014619 小时前
制作转换3Dtiles时候cesium(b3dm)模型没有阴影,没有材质感,发白显示太假怎么办
3d·arcgis·材质·3dtiles
liuccn2 天前
MBTiles的概念讲解
arcgis
GIS地信小匠3 天前
(22)ArcGIS Pro 联合与标识分析:全范围合并、属性标记,空间叠加双核心工具
arcgis·空间分析·数据处理·gis教程·arcgls pro
城数派3 天前
谷歌18亿建筑足迹数据集 Google Open Buildings V3
数据库·arcgis·信息可视化·数据分析·excel
GIS地信小匠3 天前
(24)ArcGIS Pro 字段计算与几何属性:赋值拼接、条件判断及面积坐标自动计算
arcgis·空间分析·数据处理·gis教程·arcgls pro
GIS地信小匠3 天前
(23)ArcGIS Pro 空间连接与缓冲区分析:属性传递、多环缓冲区实战全攻略
arcgis·arcgis pro·空间分析·数据处理·gis教程
GISer_Jing3 天前
智能地理空间任务引擎:GIS与AI的完美融合
arcgis