PlacePoint.js

/*
 * @Author: 叶思铧(292184)
 * @Date: 2022-08-24 11:14:45
 * @Descripttion:地名搜索专用功能  临时的类,待定
 * @LastEditors: czklove
 * @LastEditTime: 2022-11-21 15:17:24
 */
import { xMapUtil } from '@/components/map/mapUtil'
import ChangePoint from './ChangePoint.js'
let ol = window.ol
class PlacePoint {
    constructor(map) {
        this.map = map
        let mapObj = {
            mapGlobalData: {
                projection: window.proj,
                mapType: window.mapType,
            },
        }
        this.changePoint = new ChangePoint(mapObj)
        //图层中心
        this.layerObj = {}
        this.extent = []
        this.selFeature = undefined //被选中的要素
        this.oldImg = undefined //旧图标
    }
    createLayer(name) {
        let map = this.map
        //添加点图层
        let addPointsSource = new ol.source.Vector({
            wrapX: false,
        })
        let addPointsLayer = new ol.layer.Vector({
            source: addPointsSource,
            name: name,
            zIndex: 2,
        })

        map.addLayer(addPointsLayer)
        return addPointsLayer
    }
    //添加点位数据
    //默认清空之前的数据
    adds(layerName, array, level = 16) {
        if (!this.layerObj[layerName]) {
            this.layerObj[layerName] = this.createLayer(layerName)
        }
        let source = this.layerObj[layerName].getSource()
        source.clear()
        this.extent = this._getExtent(array)
        if (this.extent) {
            this.map.getView().fit(this.extent, { duration: 1000 })
        } else {
            if (array.length) {
                this.map.getView().animate({
                    center: this.changePoint.transformation([array[0].gpsX / 1, array[0].gpsY / 1]),
                    zoom: level,
                })
            }
        }
        for (let i = 0; i < array.length; i++) {
            let item = array[i]
            let lng = item.gpsX / 1
            let lat = item.gpsY / 1
            let point = this.changePoint.transformation([lng, lat])
            let pointFeature = new ol.Feature(new ol.geom.Point(point))
            let img = new Image()
            img.src = item.image
            img.onload = () => {
                let image = this._getBase64(img, item.imageText)
                item.image = image
                try {
                    pointFeature.setStyle(
                        new ol.style.Style({
                            image: new ol.style.Icon({
                                anchor: [0.5, 0.85], //有人偷懒,这个0.85是前端人调的,地图开发是不建议的
                                src: image,
                                scale: 1,
                            }),
                        })
                    )
                    pointFeature.set('element', item)
                    source.addFeature(pointFeature)
                } catch (err) {
                    console.log(err)
                    //在此处理错误
                }
            }
        }
    }
    //内部函数获取数据边界信息
    _getExtent(array) {
        if (array.length > 1) {
            let lngArray = []
            let latArray = []
            array.map((item) => {
                lngArray.push(item.gpsX / 1)
                latArray.push(item.gpsY / 1)
            })
            let [minLng, minLat, maxLng, maxLat] = [Math.min(...lngArray), Math.min(...latArray), Math.max(...lngArray), Math.max(...latArray)]
            if (minLng == maxLng || minLat == maxLat) {
                console.error('数据有重复部分,需调整代码,待定')
                return false
            }
            let p1 = this.changePoint.transformation([minLng, minLat])
            let p2 = this.changePoint.transformation([maxLng, maxLat])
            return [p1[0], p1[1], p2[0], p2[1]]
        } else {
            return false
        }
    }
    moveTo(lng, lat, level = 15) {
        this.map.getView().animate({
            center: this.changePoint.transformation([lng / 1, lat / 1]),
            zoom: level,
        })
    }

    // let img = new Image()
    // img.src = item.imageUrl
    // img.onload = () => {
    //     let image = this._getBase64(img, item.size)
    //     try {
    //         billboard.image = image
    //     } catch (err) {
    //         console.log(err)
    //         //在此处理错误
    //     }
    // }

    _getBase64(img, text, color = '#fff') {
        //这里的离屏渲染代码的宽高代码需要重新梳理下
        let body = document.getElementsByTagName('body')[0]
        let canvas = document.createElement('canvas')
        let width = 38
        let imgWidth = 35
        let imgLeft = (width - imgWidth) / 2
        canvas.width = width
        canvas.height = width
        body.appendChild(canvas)
        let cxt = canvas.getContext('2d')
        // 画图
        cxt.drawImage(img, imgLeft, imgLeft, imgWidth, imgWidth)
        // 设置字体大小
        cxt.font = '14px Microsoft YaHei'
        // 设置文本的水平垂直对齐方式
        cxt.textBaseline = 'top'
        cxt.textAlign = 'center'
        // 文字颜色
        cxt.fillStyle = color
        // 填充文字
        cxt.fillText(text, width / 2, (3 * canvas.height) / 16)
        // 转成base64
        let dataUrl = canvas.toDataURL('image/png')
        // 移除canvas节点
        body.removeChild(canvas)
        return dataUrl
    }

    //点击类表使点位变色
    //需存储feature  old的img
    selPoint(layerName, obj) {
        xMapUtil.getLayerByName('testlayer')
        if (this.selFeature) {
            this.selFeature.setStyle(
                new ol.style.Style({
                    image: new ol.style.Icon({
                        anchor: [0.5, 0.85], //有人偷懒,这个0.85是前端人调的,地图开发是不建议的
                        src: this.oldImg,
                        scale: 1,
                    }),
                })
            )
        }
        let source = this.layerObj[layerName].getSource()
        let features = source.getFeatures()
        for (let i = 0; i < features.length; i++) {
            let pointObj = features[i].get('element')
            if (obj == pointObj) {
                let img = new Image()
                img.src = obj.selImage
                img.onload = () => {
                    let image = this._getBase64(img, obj.imageText, '#fff')
                    try {
                        features[i].setStyle(
                            new ol.style.Style({
                                image: new ol.style.Icon({
                                    anchor: [0.5, 0.85], //有人偷懒,这个0.85是前端人调的,地图开发是不建议的
                                    src: image,
                                    scale: 1.3,
                                }),
                                zIndex: 100,
                            })
                        )
                        this.selFeature = features[i]
                        this.oldImg = obj.image
                    } catch (err) {
                        console.log(err)
                        //在此处理错误
                    }
                }
                break
            }
        }
    }
}
export default PlacePoint

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
请注意,由于我不知道你的数据结构和表关系,因此我无法完全优化你的代码。但是,以下是一些潜在的优化建议: 1.使用 ANSI SQL join 语法代替旧的 where 子句连接。这将使代码更清晰,易于维护。 2.尝试使用索引来优化查询性能。根据你的表结构和使用情况,可能需要对某些列添加索引。 3.考虑将一些 where 子句移动到 join 条件中。这可能会改善查询性能。 4.使用 with 子句创建临时表,以便在查询中重复使用某些数据。这可以减少查询时间并提高性能。 下面是重写后的代码,但请注意,这只是一个示例,你需要根据你的实际情况进行调整和修改。 ``` WITH sales AS ( SELECT DISTINCT rsaid, goodsid, placepointid FROM gresa_sa_dtl JOIN gresa_sa_doc ON gresa_sa_dtl.rsaid = gresa_sa_doc.rsaid WHERE to_char(gresa_sa_doc.credate, 'yyyy-mm-dd') >= ${条件.前推日期} ), filtered AS ( SELECT a.goodsid, b.goodsname, b.goodsunit, b.goodstype, k.factoryname, h.placepointid, h.placepointname, SUM(a.goodsqty) AS sl, SUM(g.unitprice * a.goodsqty) AS cb FROM bms_st_qty_lst a JOIN pub_goods b ON a.goodsid = b.goodsid JOIN gpcs_placepoint h ON a.storageid = h.storageid JOIN bms_batch_def g ON a.batchid = g.batchid JOIN pub_factory k ON b.factoryid = k.factoryid LEFT JOIN sales s ON a.goodsid = s.goodsid AND h.placepointid = s.placepointid WHERE b.accflag = 1 AND h.retailcenterid = 34 AND (h.placepointid IN (${条件.门店ID}) OR DECODE('${条件.门店ID}', 'to_number(null)', NULL, '-') IS NULL) AND (a.goodsid IN (${条件.货品ID}) OR DECODE('${条件.货品ID}', 'to_number(null)', NULL, '-') IS NULL) AND s.rsaid IS NULL GROUP BY a.goodsid, b.goodsname, b.goodsunit, b.goodstype, k.factoryname, h.placepointid, h.placepointname ORDER BY h.placepointid, a.goodsid ) SELECT * FROM filtered; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值