根据.jgwx配准文件绘制并加载图层

根据.jgwx配准文件绘制并加载图层

大部分地图api默认方法无法准确加载配准后的图层,只能根据.jgwx文件进行调整然后再加载。以配准后的图片和arcgis for js为例。

配准文件各个参数含义和解析配准文件

	/**
     * 根据图片宽高和配准文件获取坐标
     * @param point
     * @param text
     * @returns {*[]}
     */
    getGeoCoordinates:function (point,text) {
        //jgwx介绍
        // let params = [
        //     1.3788414897,//图片1像素代表的地图经度度数
        //     0,//平移量
        //     -0,//旋转角度
        //     -1.3788414897,//图片1像素代表的地图纬度度数
        //     -117842.8037035939,//图片左上角x坐标
        //     461835.7207130647,//图片左上角y坐标
        //     9296,//图片像素宽
        //     6474//图片像素高
        // ];
        var x = parseFloat(point[0]);
        var y = parseFloat(point[1]);
        var A = parseFloat(text[0]);
        var D = parseFloat(text[1]);
        var B = parseFloat(text[2]);
        var E = parseFloat(text[3]);
        var C = parseFloat(text[4]);
        var F = parseFloat(text[5]);
        var newX = A * x + B * y + C;
        var newY = D * x + E * y + F;
        return [newX, newY];
    }

根据坐标点获取画布点,然后定位图片

尝试计算实际画布上长宽和旋转角进行定位渲染,由于图片配准后会有变形的情况,最终使用transform方法变换然后定位,结果较为准确。

var TileBorderLayerView2D = BaseLayerView2D.createSubclass({
            
                    render(renderParameters) {
                        if(this.layer.__imgUrl==""){
                            return;
                        }
                        if (this.layer.__img == null ) {
                            var that = this;
                            esriRequest(this.layer.__imgUrl, {
                                responseType: "image"
                            }).then(function (res) {
                                that.layer.__img = res.data;
                                that.render(renderParameters);
                            });
                            return;
                        }
                        var img = this.layer.__img;
                        var extent = this.layer.__extent;
                        var state = renderParameters.state;
                        var pixelRatio = state.pixelRatio;
                        var width = state.size[0];
                        var height = state.size[1];
                        var jswx = this.layer.jswxFile;
                        var context = renderParameters.context;
                        context.globalAlpha = this.layer.opacity;
                        context.fillStyle = "rgba(0,0,0,0)";
                        context.fillRect(0, 0, width * pixelRatio, height * pixelRatio);

                        var imgWidth = this.layer.__img.width;
                        var imgHeight = this.layer.__img.height;
                        var imgP2 = [imgWidth,imgHeight];
                        var imgP3 = [0,imgHeight];
                        var geoP1 = [jswx[4]*1,jswx[5]*1];
                        var geoP2 = mapModule.getGeoCoordinates(imgP2,jswx);
                        var geoP3 = mapModule.getGeoCoordinates(imgP3,jswx);
                        var widthCoor = mapModule.getGeoCoordinates([imgWidth,0],jswx); //右上

                        // context.rotate(0.00018309211411693534*180/Math.PI);
                        var xp1 = geoP1[0] - jswx[0]/2;
                        var yp1 = geoP1[1] + jswx[3]/2;
                        var xp2 = geoP2[0] - jswx[0]/2;
                        var yp2 = geoP2[1] + jswx[3]/2;
                        var xp3 = geoP3[0] - jswx[0]/2;
                        var yp3 = geoP3[1] + jswx[3]/2;

                        var bottomLine = [xp2-xp3,yp2-yp3];
                        // var rotate = Math.atan(bottomLine[1]/bottomLine[0]); //向量计算角度 不准确

                        var sc_xy1 = mapModule.view.toScreen({x:xp1,y:yp1,spatialReference:{ wkid: 4326}});//左上角画布上的坐标
                        var sc_xy2 = mapModule.view.toScreen({x:xp2,y:yp2,spatialReference:{ wkid: 4326}});//右下角画布上的坐标
                        var sc_xy3 = mapModule.view.toScreen({x:xp3,y:yp3,spatialReference:{ wkid: 4326}});//左下角画布上的坐标
                        var sc_xy4 = mapModule.view.toScreen({x:widthCoor[0],y:widthCoor[1],spatialReference:{ wkid: 4326}});//右上角画布上的坐标

                        var cavRot = angleAB([sc_xy1.x,sc_xy1.y],[sc_xy4.x,sc_xy4.y]); //画布计算角度 准确
                        var bottomLine = [sc_xy2.x-sc_xy3.x,sc_xy2.y-sc_xy3.y];
                        var rotate = Math.atan(bottomLine[1]/bottomLine[0]); //向量计算角度 更精确
                        if(sc_xy2.y<0||sc_xy2.x<0||sc_xy1.x>width||sc_xy1.y>height){
                            return;
                        }
                        var sc_w_j = Math.sqrt((sc_xy2.y - sc_xy3.y)*(sc_xy2.y - sc_xy3.y)+(sc_xy2.x - sc_xy3.x)*(sc_xy2.x - sc_xy3.x));//画布上图片应该的宽
                        var sc_h_j = Math.sqrt((sc_xy3.y - sc_xy1.y)*(sc_xy3.y - sc_xy1.y)+(sc_xy3.x - sc_xy1.x)*(sc_xy3.x - sc_xy1.x));//画布上图片应该的高
                        var sc_h = sc_xy2.y - sc_xy1.y;//画布上图片应该的宽
                        var sc_w = sc_xy2.x - sc_xy1.x;//画布上图片应该的高

                        // 新方法定位图片 在用方法,较为准确
                        var pxTopLeft    = sc_xy1;
                        var pxTopRight   = sc_xy4;
                        var pxBottomLeft = sc_xy3;
                        var pxBottomRight = sc_xy2;

                        var allPoints = [pxTopLeft,pxTopRight,pxBottomLeft,pxBottomRight];

                        var minBounds = {};
                        var bounds = {
                            top:100000,
                            bottom:0,
                            left:100000,
                            right:0
                        };
                        for (var i = 0; i < allPoints.length; i++) {
                            if (allPoints[i].x > bounds.right) {
                                bounds.right = allPoints[i].x;
                            }
                            if (allPoints[i].x < bounds.left) {
                                bounds.left = allPoints[i].x;
                            }
                            if (allPoints[i].y > bounds.bottom) {
                                bounds.bottom = allPoints[i].y;
                            }
                            if (allPoints[i].y < bounds.top) {
                                bounds.top = allPoints[i].y;
                            }
                        }
                        var sc_w_tra = bounds.right - bounds.left;
                        var sc_h_tra = bounds.bottom - bounds.top;
                        minBounds.x = pxBottomLeft.x>pxTopLeft.x ? pxTopLeft.x:pxBottomLeft.x;
                        minBounds.y = pxTopLeft.y>pxTopRight.y? pxTopRight.y:pxTopLeft.y;

                        var pxTopLeftInDiv = getDiffValue(minBounds,pxTopLeft);

                        var imgW = imgWidth;
                        var imgH = imgHeight;
                        if (!imgW || !imgH) {
                            return;	// 图片未加载直接返回
                        }

                        var vectorX = getDiffValue(pxTopLeft,pxTopRight);
                        var vectorY = getDiffValue(pxTopLeft,pxBottomLeft);

                        //计算图片形变参数,关键步骤
                        var parms = [vectorX.x/sc_w_tra, vectorX.y/sc_w_tra, vectorY.x/sc_h_tra, vectorY.y/sc_h_tra, pxTopLeftInDiv.x, pxTopLeftInDiv.y];
                        try {
                            context.translate(minBounds.x, minBounds.y);//定位总画布左上角,旧方法定位图片左上角坐标
                            // context.rotate(rotate); //旧方法旋转图片
                            context.transform(parms[0],parms[1],parms[2],parms[3],parms[4],parms[5]);//形变
                            context.drawImage(img, 0,0,sc_w_tra,sc_h_tra);//在画布上定位图片   左上角坐标x,y  图片相对画布原始宽高 width,height
                        }catch (e) {
                            console.log(sc_xy1.x, sc_xy1.y,sc_w,sc_h);
                        }
                        // var datas = context.getImageData(sc_xy1.x, sc_xy1.y,sc_w,sc_h);
                    }
                });
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
牙科就诊管理系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线查看数据。管理员管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等功能。牙科就诊管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 管理员在后台主要管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等。 牙医列表页面,此页面提供给管理员的功能有:查看牙医、新增牙医、修改牙医、删除牙医等。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。药品管理页面,此页面提供给管理员的功能有:新增药品,修改药品,删除药品。药品类型管理页面,此页面提供给管理员的功能有:新增药品类型,修改药品类型,删除药品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值