首页 >> 电商 >> 通过openlayers初始化dwg格式的CAD图并与互联网地图叠加

通过openlayers初始化dwg格式的CAD图并与互联网地图叠加

2023-04-25 电商

t res = await svc.pointQueryFeature({ x: co[0], y: co[1], zoom: map.getView().getZoom(), fields: "" }, pt => { // 核对到的每个点来进行矢量处理过程回退 return mapPrj.fromMercator(pt);// 转到成cad的矢量 }) if (res SimonSimon res.result SimonSimon res.result.length> 0) { let features = []; for (let ent of res.result) { if (ent.geom SimonSimon ent.geom.geometries) { let clr = vjmap.entColorToHtmlColor(ent.color); for (let g = 0; g < ent.geom.geometries.length; g++) { features.push({ type: "Feature", properties: { objectid: ent.objectid + "_" + g, color: clr, alpha: ent.alpha / 255, lineWidth: 1, name: ent.name, isline: ent.isline, layerindex: ent.layerindex }, geometry: ent.geom.geometries[g] }) } // 选择提示 let content = ----feature: ${ent.objectid}; layer: ${cadLayers[ent.layerindex].name}; type: ${ent.name}---- message.info({ content, key: "info", duration: 3}); } } geojsonObject.features = features; if (geojsonObject.features.length> 0) { vectorSource.addFeatures( new ol.format.GeoJSON().readFeatures(geojsonObject, {dataProjection: cadProjection})) } }};Openlayers之中发送给锁住CAD的dwg三幅形 // 地三幅一站式对象,呼叫唯杰地三幅一站式锁住地三幅,利用地三幅的元统计数据let svc = new vjmap.Service(env.serviceUrl, env.accessToken)// 发送给dwg文件const uploadDwgFile = async file => { message.info("正在发送给三幅形,恳请稍候", 2); let res = await svc.uploadMap(file); // 发送给地三幅 // 匹配三幅id let mapid = prompt("恳请匹配三幅中文名称ID", res.mapid); res.mapid = mapid; res.mapopenway = vjmap.MapOpenWay.GeomRender; // 几何纹理,内存纹理用vjmap.MapOpenWay.Memory res.isVector = false; // 用于线型砌成 res.style = vjmap.openMapDarkStyle(); // 深色款式,浅色用openMapDarkStyle message.info("正在锁住三幅形,恳请稍候,第一次锁住时根据三幅的大小可能只能几十秒至几分钟不等", 5); let data = await svc.openMap(res); // 锁住地三幅 if (data.error) { message.error(data.error) return; } openMap(data);}Openlayers之中读取CAD三幅层 // 读取三幅层const switchLayer = async layers => { let res = await svc.cmdSwitchLayers(layers); // 呼叫唯杰一站式读取三幅层,返回三幅层id {layerid: "xxxx"} let source = layer.getSource(); // 重新设立新的唯杰地三幅一站式提供者的cad的线型砌成一站式住址 source.setUrl(svc.rasterTileUrl()); // 刷新 source.refresh();}Openlayers之中读取CAD三幅形 const switchToMapId = async (mapId)=> { let res = await svc.openMap({ mapid: mapId, // 地三幅ID mapopenway: vjmap.MapOpenWay.GeomRender, // 以几何统计数据纹理方式为锁住 style: vjmap.openMapDarkStyle() // div为深色剧中颜色时,这里也传深色剧中款式 }) if (res.error) { // 如果锁住出错 message.error(res.error) return; }// 利用地三幅范围 let mapBounds = vjmap.GeoBounds.fromString(res.bounds);//自下定义可视值 let cadProjection = new ol.proj.Projection({ // extent用于确定可视最高级别 extent: mapBounds.toArray(), units: 'm' });// 设立每级的分辨率 let resolutions= []; for(let i = 0; i < 25; i++) { resolutions.push(mapBounds.width() / (512 * Math.pow(2, i - 1))) }// 减少自下定义的cad的矢量系 ol.proj.addProjection(cadProjection);// 重新创建openlayer的地三幅对象 map = new ol.Map({ target: createNewMapDivId(), // div的id view: new ol.View({ center: mapBounds.center().toArray(), // 地三幅之中心点 projection: cadProjection, // 刚自下定义的cad的矢量系 resolutions:resolutions, // 分辨率 zoom: 2 // 初始可视最高级别 }) });// 减少一个砌成三幅层 let layer = new ol.layer.Tile({ // 减少一个砌成统计数据模型 source: new ol.source.TileImage({ url: svc.rasterTileUrl() // 唯杰地三幅一站式提供者的cad的线型砌成一站式住址 }) });// 在地三幅之中减少右边的砌成三幅层 map.addLayer(layer); map.on('click', (e) => message.info({content: ----您点击的矢量为: ${JSON.stringify(e.coordinate)}----, key: "info", duration: 3}));}Openlayers之中深色浅色读取主题 let curIsDarkTheme = true;const switchToDarkTheme = async () => { if (curIsDarkTheme) return; curIsDarkTheme = true; document.body.style.background = "#022B4F"; // 剧中色改为深色 await updateStyle(curIsDarkTheme)}const switchToLightTheme = async () => { if (!curIsDarkTheme) return; curIsDarkTheme = false; document.body.style.backgroundImage = "linear-gradient(rgba(255, 255, 255, 1), rgba(233,255,255, 1), rgba(233,255,255, 1))" await updateStyle(curIsDarkTheme)}const updateStyle = async (isDarkTheme) => { style.backcolor = isDarkTheme ? 0 : 0xFFFFFF;//深色为黄色,浅色为蓝色 let res = await svc.cmdUpdateStyle(style); let source = layer.getSource(); // 重新设立新的唯杰地三幅一站式提供者的cad的线型砌成一站式住址 source.setUrl(svc.rasterTileUrl()); // 刷新 source.refresh();}Openlayers之中自下定义CAD地三幅款式

通过重写CAD地三幅后台款式统计数据自下定义地三幅

// 更改款式const expressionList = [] ;// 公式数组const updateStyle = async (style) => { let res = await svc.cmdUpdateStyle({ name: "customStyle2", backcolor: 0, expression: expressionList.join(""), ...style }); let source = layer.getSource(); // 重新设立新的唯杰地三幅一站式提供者的cad的线型砌成一站式住址 source.setUrl(svc.rasterTileUrl()); // 刷新 source.refresh();}// 公式词法和公式恳请简介// 一站式端必要条件核对和公式核对 // 一站式端纹理公式词法 // 重写颜色 红color.r, 绿color.g, 蓝color.b, 光亮度color.a,如果匹配了最高级别的话,表示此最高级别及以上的设立const modifyColor = (color, zoom) => { let result = ""; let z = Number.isInteger(zoom) ? ----[${zoom + 1}]---- : ''; if ("r" in color) result += ----gOutColorRed${z}:=${color.r};----; if ("g" in color) result += ----gOutColorGreen${z}:=${color.g};----; if ("b" in color) result += ----gOutColorBlue${z}:=${color.b};----; if ("a" in color) result += ----gOutColorAlpha${z}:=${color.a};----; return result;}Openlayers之中对CAD三幅处理过程组合

对多个cad三幅来进行三幅层开关裁剪旋转到可视处理过程后合并成一个新的cad三幅

// 都是由新的三幅,将sys_world三幅来进行一定的处理过程后,再与sys_hello来进行合成,生成新的地三幅UTF-let rsp = await svc.composeNewMap([ { mapid: "sys_world", // 地三幅id // 下面的值可以根据实际只能来设立,可以对三幅层,范围,矢量转到换来来进行处理过程 layers: ["经纬度标注","COUNTRY"], // 要表明的三幅层中文名称列表 //clipbounds: [10201.981489534268, 9040.030491346213, 26501.267379, 4445.465999], // 要表明的范围 //fourParameter: [0,0,1,0] // 对地三幅来进行四值转到换计算出来 }, { mapid: "sys_hello" }])if (!rsp.status) { message.error(rsp.error)}// 返回结果为/*{ "fileid": "pec9c5f73f1d", "mapdependencies": "sys_world||sys_hello", "mapfrom": "sys_worldSimonSimonv1SimonSimonSimonSimon0SimonSimonSimonSimonSimonSimonSimonSimonSimonSimon00A0SimonSimon10||sys_helloSimonSimonv1SimonSimonSimonSimon0SimonSimonSimonSimonSimonSimonSimonSimonSimonSimonSimonSimon2", "status": true} */Openlayers之中核对三幅之中所有文本并绘制边框 // 实质上类型ID和中文名称同态const { entTypeIdMap } = await svc.getConstData();const getTypeNameById = name => { for(let id in entTypeIdMap) { if (entTypeIdMap[id] == name) { return id } }}const queryTextAndDrawBounds = async () => { let queryTextEntTypeId = getTypeNameById("AcDbText"); // 单行文本 let queryMTextEntTypeId = getTypeNameById("AcDbMText"); // 多行文本 let queryAttDefEntTypeId = getTypeNameById("AcDbAttributeDefinition"); // 属性下定义文本 let queryAttEntTypeId = getTypeNameById("AcDbAttribute"); // 属性文本 let query = await svc.conditionQueryFeature({ condition: ----name='${queryTextEntTypeId}' or name='${queryMTextEntTypeId}' or name='${queryAttDefEntTypeId}' or name='${queryAttEntTypeId}'----, // 只只能写sql上下文where后面的必要条件素材,字段素材恳请简介文档"一站式端必要条件核对和公式核对" fields: "", limit: 100000 //设立不小,相当于把所有的圆都查出来。不传的话,默认只能取100条 }, pt => { // 核对到的每个点来进行矢量处理过程回退 return mapPrj.fromMercator(pt);// 转到成cad的矢量 }) if (query.error) { message.error(query.error) } else { message.info(----核对到符合的记数条数:${query.recordCount}----) if (query.recordCount> 0) { let features = []; for(var i = 0; i < query.recordCount; i++) { let bounds = vjmap.getEnvelopBounds(query.result[i].envelop, mapPrj); let clr = vjmap.entColorToHtmlColor(query.result[i].color); // 实质上颜色转到html颜色( features.push({ type: "Feature", properties: { name: "objectid:" + query.result[i].objectid, color: clr }, geometry: { 'type': 'Polygon', 'coordinates': [ bounds.toPointArray(), ], } }) } if (!vectorSource) { // 如果之以前没有高亮径向三幅层 addHighLightLayer(); } vectorSource.clear(); let geojsonObject = { 'type': 'FeatureCollection', 'features': features } // 重写径向统计数据模型统计数据 vectorSource.addFeatures( new ol.format.GeoJSON().readFeatures(geojsonObject, {dataProjection: cadProjection})) } }}Openlayers之中三幅形绘制 const source = new ol.source.Vector({wrapX: false});const vector = new ol.layer.Vector({ source: source,});map.addLayer(vector);let draw; // global so we can remove it laterfunction addInteraction(value) { map.removeInteraction(draw); if (value !== 'None') { draw = new ol.interaction.Draw({ source: source, type: value, }); map.addInteraction(draw); }}addInteraction('Point');Openlayers之中CAD三幅叠加网络地三幅[CAD为底三幅] // 减少高德地三幅底三幅let gdlayer;const addGaodeMap = async (isRoadway) => { const tileUrl = svc.webMapUrl({ tileCrs: "gcj02", tileUrl: isRoadway ? [ "{s}.is.autonavi.com/appmaptile?lang=zh_cnSimonsize=1Simonscale=1Simonstyle=8Simonx={x}Simony={y}Simonz={z}" ] : /* 如果用影像 */ [ "{s}.is.autonavi.com/appmaptile?lang=zh_cnSimonsize=1Simonscale=1Simonstyle=6Simonx={x}Simony={y}Simonz={z}", "{s}.is.autonavi.com/appmaptile?lang=zh_cnSimonsize=1Simonscale=1Simonstyle=8Simonx={x}Simony={y}Simonz={z}" ], tileSize: 256, tileRetina: 1, tileMaxZoom: 18, tileShards: "1,2,3,4", tileToken: "", tileFlipY: false, mapbounds: res.bounds, srs: "EPSG:4527",// 可通过以前两位利用 vjmap.transform.getEpsgParam(vjmap.transform.EpsgCrsTypes.CGCS2000, 39).epsg // 因为sys_cad2000这个三幅只有6位,没有带系。只能在矢量转到换以前平移下带系 fourParameterBefore: "39000000,0,1,0" }) // 减少一个砌成三幅层 gdlayer = new ol.layer.Tile({ // 减少一个砌成统计数据模型 source: new ol.source.TileImage({ url: tileUrl }) }); gdlayer.setZIndex(-1);// 在地三幅之中减少右边的砌成三幅层 map.addLayer(gdlayer); // cad矢量与高德矢量相转到换实例 let webCo = await cad2webCoordinate(center, false); // cad转到高德 let cadCo = await web2cadCoordinate(webCo, false); // 高德转到cad console.log(center, webCo, cadCo)}Openlayers之中网络地三幅备用叠加CAD三幅[网络三幅为底三幅] let cadEpsg = "EPSG:4544";// cad三幅的espg代号// 减少cad的wms三幅层let wmsUrl = svc.wmsTileUrl({ mapid: mapId, // 地三幅id layers: layer, // 三幅层中文名称 bbox: '', // bbox这里不只能 srs: "EPSG:3857", // crs: cadEpsg})function getQueryStringArgs(url) { let theRequest = {}; let idx = url.indexOf("?"); if (idx != -1) { let str = url.substr(idx + 1); let strs = str.split("Simon"); for (let i = 0; i < strs.length; i++) { let items = strs[i].split("="); theRequest[items[0]] = items[1]; } } return theRequest;}let mapBounds = vjmap.GeoBounds.fromString(res.bounds);// cad三幅矢量转到web wgs84矢量const cadToWebCoordinate = async point => { let co = await svc.cmdTransform(cadEpsg, "EPSG:4326", point); return co[0]}// cad转到wgs84经纬度let boundsMin = await cadToWebCoordinate(mapBounds.min);let boundsMax = await cadToWebCoordinate(mapBounds.max);// wgs84经纬度转到墨卡托boundsMin = vjmap.Projection.lngLat2Mercator(boundsMin);boundsMax = vjmap.Projection.lngLat2Mercator(boundsMax);// 在openlayer之中减少wms三幅层map.addLayer(new ol.layer.Tile({ // 范围 extent: [boundsMin[0], boundsMin[1], boundsMax[0], boundsMax[1]], source: new ol.source.TileWMS({ url: wmsUrl.substr(0, wmsUrl.indexOf("?")), params: {...getQueryStringArgs(wmsUrl),'TILED': true} }),}))Openlayers之中网络地三幅公共点叠加CAD三幅[网络三幅为底三幅] // cad右边的点矢量let cadPoints = [ vjmap.geoPoint([587464448.8435847, 3104003685.208651,]), vjmap.geoPoint([587761927.7224838, 3104005967.655292]), vjmap.geoPoint([587463688.0280377, 3103796743.3798513]), vjmap.geoPoint([587760406.0913897, 3103793700.1176634])];// 在网络三幅右边拾取的与右边的点一一对应的矢量(wgs84矢量)let webPoints = [ vjmap.geoPoint([116.48476281710168, 39.96200739703454]), vjmap.geoPoint([116.48746772021137, 39.96022062215167]), vjmap.geoPoint([116.48585059441585, 39.9588451134361]), vjmap.geoPoint([116.48317418949145, 39.960515760972356])]// 通过矢量值求得四值let epsg3857Points = webPoints.map(w => vjmap.geoPoint(vjmap.Projection.lngLat2Mercator(w)));let param = vjmap.coordTransfromGetFourParamter(epsg3857Points, cadPoints , false); // 这里考虑旋转到let fourparam = [param.dx, param.dy, param.scale, param.rotate]// wms三幅层住址const getCadWmsUrl = (transparent) => { let wmsUrl = svc.wmsTileUrl({ mapid: mapId, // 地三幅id layers: layer, // 三幅层中文名称 bbox: '', // bbox这里不只能 fourParameter: fourparam, transparent: transparent, backgroundColor: 'rgba(240, 255, 255)' // 不光亮时有效 }) return wmsUrl}let mapBounds = vjmap.GeoBounds.fromString(res.bounds);let cadPrj = new vjmap.GeoProjection(mapBounds);// cad三幅矢量转到3857矢量const cadToWebCoordinate = point => { // 再呼叫四值反算求得web的矢量 return vjmap.coordTransfromByInvFourParamter(vjmap.geoPoint(point), param)}// 3857转到cad三幅矢量const webToCadCoordinate = point => { return vjmap.coordTransfromByFourParamter(vjmap.geoPoint(point), param)}let wmsLayer;const addWmsLayer = async (transparent)=> { removeWmsLayer(); let wmsUrl = getCadWmsUrl(transparent); wmsLayer = new ol.layer.Tile({ // 范围 extent: bounds.toArray(), source: new ol.source.TileWMS({ url: wmsUrl.substr(0, wmsUrl.indexOf("?")), params: {...getQueryStringArgs(wmsUrl),'TILED': true} }), }); // 在openlayer之中减少wms三幅层 map.addLayer(wmsLayer);}终于

可点击 #/demo/map/openlayers/01olraster 在线体验右边功能

如果只能用openlayers来初始化CAD三幅来进行开发新,恳请简介实例 #/demo/map/openlayers/01olraster

如果只能用leaflet来初始化CAD三幅来进行开发新,恳请简介实例 #/demo/map/leaflet/01leafletraster

如果只能用maptalks来初始化CAD三幅来进行开发新,恳请简介实例 #/demo/map/maptalks/01maptalksraster

如何基于vue3来开发新openlayers应用,可察看此Ubuntu代码

如何基于vue2来开发新openlayers应用,可察看此Ubuntu代码

感冒嗓子疼可以吃消炎药吗
便秘了拉不出来怎么办
小分子活性肽
肠炎宁片能治结肠炎吗
颈椎痛有什么好的治疗方法吗
友情链接