当前位置: 首页 > news >正文

北京住房建设官方网站专门做二手手机的网站有哪些

北京住房建设官方网站,专门做二手手机的网站有哪些,网站设计网站设计公司价格,域名备案 填写网站信息吗概述 随着数据经度的提升#xff0c;18级的切片有些场景已经不够用了#xff0c;但是大部分在线的栅格切片最大级别还是18级#xff0c;如果地图继续放大#xff0c;有的框架#xff08;leaflet会#xff0c;openlayers和mapboxGL不会#xff09;会存在没有底图的情况。…概述 随着数据经度的提升18级的切片有些场景已经不够用了但是大部分在线的栅格切片最大级别还是18级如果地图继续放大有的框架leaflet会openlayers和mapboxGL不会会存在没有底图的情况。为处理这种情况本文通过node实现在级别大于18级的时候将18级的切片进行裁切解决没有底图的问题。 实现效果 实现代码 获取切片图片如果z大于18则取18级的切片进行切割否则直接返回。 getTileData(z, x, y) {return new Promise(resolve {let url , extent [], xy18 []if(z 18 ) {extent this.getTileExtent(z, x, y)const [minX, minY, maxX, maxY] extent// 获取18级对应的索引xy18 this.getTileIndexByCoords((minX maxX) / 2, (minY maxY) / 2)const [x18, y18] xy18url https://webrd01.is.autonavi.com/appmaptile?style8langzh_cnsize1scale1x${x18}y${y18}z18} else {url https://webrd01.is.autonavi.com/appmaptile?style8langzh_cnsize1scale1x${x}y${y}z${z}}loadImage(url).then(image {this.ctx.clearRect(0, 0, this.TILE_SIZE, this.TILE_SIZE)if(z 18) {const [minX, minY, maxX, maxY] extentconst [x18, y18] xy18const [minX18, minY18, maxX18, maxY18] this.getTileExtent(18, x18, y18)const [srcx18, srcy18] this.toScreen(minX18, maxY18)const [srcxmin, srcymin] this.toScreen(minX, maxY)const [srcxmax, srcymax] this.toScreen(maxX, minY)const scrx Math.round(srcxmin - srcx18), scry Math.round(srcymin - srcy18)const width Math.round(srcxmax - srcx18 - scrx), height Math.round(srcymax - srcy18 - scry)this.ctx.drawImage(image, scrx, scry, width, height, 0, 0, this.TILE_SIZE, this.TILE_SIZE)} else {this.ctx.drawImage(image, 0, 0, this.TILE_SIZE, this.TILE_SIZE)}resolve(this.canvas.toBuffer(image/png))})}) }getTileExtent为根据切片索引获取切片范围其实现如下 getResolution(z) {return (this.TILE_ORIGIN * 2) / (Math.pow(2, z) * this.TILE_SIZE) } /*** 获取切片范围* param {number} z * param {number} x * param {number} y * returns {number}*/ getTileExtent(z, x, y) {const res this.getResolution(z)const minX x * this.TILE_SIZE * res - this.TILE_ORIGINconst maxX (x 1) * this.TILE_SIZE * res - this.TILE_ORIGINconst minY this.TILE_ORIGIN - (y 1) * this.TILE_SIZE * resconst maxY this.TILE_ORIGIN - y * this.TILE_SIZE * resreturn [minX, minY, maxX, maxY] }其中 TILE_SIZE切片大小值为256TILE_ORIGIN切片原点值为20037508.34 getTileIndexByCoords为根据坐标获取切片索引实现代码如下 getTileIndexByCoords(x, y) {const res18 this.getResolution(18) * this.TILE_SIZEreturn [Math.floor((x this.TILE_ORIGIN) / res18),Math.floor((this.TILE_ORIGIN - y) / res18)] }toScreen实现将地理坐标转换为屏幕坐标。 toScreen(x, y) {const res18 this.getResolution(18)return [(x this.TILE_ORIGIN) / res18,(this.TILE_ORIGIN - y) / res18] }完整代码如下 import { createCanvas, loadImage } from canvas import express from expressconsole.time(app)const app express()// 自定义跨域中间件 const allowCors function (req, res, next) {res.header(Access-Control-Allow-Origin, req.headers.origin);res.header(Access-Control-Allow-Methods, GET,PUT,POST,DELETE,OPTIONS);res.header(Access-Control-Allow-Headers, Content-Type);res.header(Access-Control-Allow-Credentials, true);next(); }; app.use(allowCors);// 使用跨域中间件app.use(express.static(public))class TileUtil {constructor() { this.TILE_ORIGIN 20037508.34 // 切片原点this.TILE_SIZE 256; // 切片大小this.canvas createCanvas(this.TILE_SIZE, this.TILE_SIZE)this.ctx this.canvas.getContext(2d)}/*** 计算分辨率* param {number} z - 缩放级别* returns {number}*/getResolution(z) {return (this.TILE_ORIGIN * 2) / (Math.pow(2, z) * this.TILE_SIZE)}/*** 获取切片范围* param {number} z * param {number} x * param {number} y * returns {number}*/getTileExtent(z, x, y) {const res this.getResolution(z)const minX x * this.TILE_SIZE * res - this.TILE_ORIGINconst maxX (x 1) * this.TILE_SIZE * res - this.TILE_ORIGINconst minY this.TILE_ORIGIN - (y 1) * this.TILE_SIZE * resconst maxY this.TILE_ORIGIN - y * this.TILE_SIZE * resreturn [minX, minY, maxX, maxY]}/*** 将地理坐标转换为屏幕坐标* param {number} x * param {number} y * returns {number}*/toScreen(x, y) {const res18 this.getResolution(18)return [(x this.TILE_ORIGIN) / res18,(this.TILE_ORIGIN - y) / res18]}/*** 获取切片图片如果z大于18则取18级的切片进行切割否则直接返回* param {number} z * param {number} x * param {number} y * returns {BufferImage}*/getTileData(z, x, y) {return new Promise(resolve {let url , extent [], xy18 []if(z 18 ) {extent this.getTileExtent(z, x, y)const [minX, minY, maxX, maxY] extent// 获取18级对应的索引xy18 this.getTileIndexByCoords((minX maxX) / 2, (minY maxY) / 2)const [x18, y18] xy18url https://webrd01.is.autonavi.com/appmaptile?style8langzh_cnsize1scale1x${x18}y${y18}z18} else {url https://webrd01.is.autonavi.com/appmaptile?style8langzh_cnsize1scale1x${x}y${y}z${z}}loadImage(url).then(image {this.ctx.clearRect(0, 0, this.TILE_SIZE, this.TILE_SIZE)if(z 18) {const [minX, minY, maxX, maxY] extentconst [x18, y18] xy18const [minX18, minY18, maxX18, maxY18] this.getTileExtent(18, x18, y18)const [srcx18, srcy18] this.toScreen(minX18, maxY18)const [srcxmin, srcymin] this.toScreen(minX, maxY)const [srcxmax, srcymax] this.toScreen(maxX, minY)const scrx Math.round(srcxmin - srcx18), scry Math.round(srcymin - srcy18)const width Math.round(srcxmax - srcx18 - scrx), height Math.round(srcymax - srcy18 - scry)this.ctx.drawImage(image, scrx, scry, width, height, 0, 0, this.TILE_SIZE, this.TILE_SIZE)} else {this.ctx.drawImage(image, 0, 0, this.TILE_SIZE, this.TILE_SIZE)}resolve(this.canvas.toBuffer(image/png))})})}/*** 根据坐标获取切片索引* param {number} x * param {number} y * returns {[number, number]}*/getTileIndexByCoords(x, y) {const res18 this.getResolution(18) * this.TILE_SIZEreturn [Math.floor((x this.TILE_ORIGIN) / res18),Math.floor((this.TILE_ORIGIN - y) / res18)]} }const util new TileUtil()app.get(/tile/:z/:x/:y, (req, res) {const { z, x, y } req.paramsutil.getTileData(Number(z), Number(x), Number(y)).then(data {res.setHeader(Expires, new Date(Date.now() 30 * 1000).toUTCString())res.writeHead(200, {Content-Type: image/png,});res.end(data);}) })app.get(/tile-bbox/:z/:x/:y, (req, res) {const { z, x, y } req.paramsconst TILE_SIZE 256;const canvas createCanvas(TILE_SIZE, TILE_SIZE)const ctx canvas.getContext(2d)ctx.fillStyle #f00ctx.strokeStyle #f00ctx.lineWidth 2ctx.textAlign center;ctx.textBaseline middlectx.font bold 18px 微软雅黑;ctx.strokeRect(0, 0, TILE_SIZE, TILE_SIZE)ctx.fillText(${z}-${x}-${y}, TILE_SIZE / 2, TILE_SIZE / 2)res.setHeader(Expires, new Date(Date.now() 30 * 1000).toUTCString())res.writeHead(200, {Content-Type: image/png,});res.end(canvas.toBuffer(image/png)); })app.listen(18089, () {console.timeEnd(app)console.log(express server running at http://127.0.0.1:18089) })
http://www.tj-hxxt.cn/news/226486.html

相关文章:

  • 科技公司网站设二次开发是什么
  • 地方性门户网站公司网站维护费大概需要多少
  • 重庆博达建设集团股份有限公司网站wordpress 相册插件
  • 产品展示类网站登封网站关键词优化软件
  • Apple 手机网站制作银川市做网站的公司
  • 电脑怎么用别人的网站吗制作网站详细步骤
  • 网站聊天系统怎么做做网站能赚钱么
  • 平稳有序推进网站建设wordpress 评论表情
  • 环保h5微网站做内衣的网站
  • 厦门外贸网站建设 之家电视购物平台
  • 唐山网站建设公司网站开发技术岗位职责
  • 网站建设 资讯动态dw做好的网页如何发布
  • 最精品网站建设俄罗斯搜索引擎浏览器官网入口
  • 营销型企业网站功能苏州调查公司招聘信息
  • 为什么说做网站赚钱wordpress用户信息
  • 建立网站预算北京手机网站制作
  • 视频网站开发需要什么语言小程序怎么做微网站链接
  • 南山优化网站建设案例分公司注册流程网上注册
  • 网站上线需要哪些步骤开发板和单片机的区别
  • 省财政厅门户网站三基建设公司有网站域名后如何建网站
  • 公司已经有域名 怎么建网站四川省住房和城乡建设厅官网证件查询
  • 哪些建材网站可以做宣传怎么给网站做seo优化
  • 门户网站属于数字媒体吗学做企业网站
  • 网站建设的摘要wordpress 禁用评论
  • 超星网站开发实战答案凌云网招聘信息
  • 搭建好网站如何使用h5案例分享平台
  • 大型网站 解决方案 技术怎么做打码网站
  • 关于化妆品网站成功案例网站木马 代码
  • 网站上点击图片局部放大如何做营销是做什么
  • 企业网站怎么推广网站添加cms