乡镇级别数据可视化,乡镇地图的genJson数据获取(进阶版)

这次综合网上的一些方法找到了获取象征级别genjson数据的方法。比前面一篇更加合理。

先上一个效果图。

首先需要站在巨人的肩膀上,下载几个依赖。

svg2genjson  依靠这个可以将svg转为可使用的genjson。尽量用  yarn 来安装依赖,npm 会有问题(你的node.js版本在11以下或者gulp版本>4就没问题)

可以在package.json中加这个代码解决

  // 锁定版本
"resolutions": {
    "graceful-fs": "4.2.2"
  },

乡镇的svg数据获取可以在这里获取  获取乡镇的svg图片

这里获取的svg 并不能直接通过 svg2geojson 来进行转化,因为他只支持矢量地图。

这里是我自己写的一个方法将下载的svg  转化成可使用的 矢量地图。

 这里的svg标签是在 上面获取的乡镇的 svg 。用记事本打开后直接复制到代码里面。

记得给svg 加一个    id=‘svgEl’   不然会报错。

这是script 的代码    

yarn add svg-path-parser

init() {
      const svgEl = document.getElementById('svgEl')
      const nameList = []
      const data = []
      ;[...svgEl.children[1].children].forEach((v) => {
        nameList.push(v)
      })
      nameList.pop()
      let postion = nameList.reverse().findIndex((el) => el.nodeName === 'path')
      nameList.slice(0, postion).forEach((el) => {
        data.push({
          id: el.innerHTML.trim(),
        })
      })
      nameList.slice(postion, 2 * postion).forEach((el, i) => {
        data[i] = { ...data[i], path: el.attributes[1].value }
      })
      data.forEach((v) => {
        this.svg(v)
      })
// 这个log 输出的东西就是我们需要的矢量地图 直接在控制台copy 一下
      console.log(
        `
 <?xml version="1.0" encoding="utf-8"?>
 <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
  <svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
	width="727px" height="911px" viewBox="-100 0 727 911" enable-background="new -297.5 420.5 727 911" xml:space="preserve">
 ${this.list}
  </svg>
  	`.trim()
      )
    },
 svg(svgData) {
      const { parseSVG, makeAbsolute } = require('svg-path-parser')
      function svgPathToPolygons(svgPathString, opts = {}) {
        if (!opts.tolerance) opts.tolerance = 1
        const polys = []
        const tolerance2 = opts.tolerance * opts.tolerance
        let poly = []
        let prev
        makeAbsolute(parseSVG(svgPathString)).forEach((cmd) => {
          let x1 = 0,
            y1 = 0

          switch (cmd.code) {
            case 'M':
              polys.push((poly = []))
              // intentional flow-through
              break
            case 'L':
            case 'H':
            case 'V':
            case 'Z':
              add(cmd.x, cmd.y)
              if (cmd.code === 'Z') poly.closed = true
              break

            case 'C':
              sampleCubicBézier(
                cmd.x0,
                cmd.y0,
                cmd.x1,
                cmd.y1,
                cmd.x2,
                cmd.y2,
                cmd.x,
                cmd.y
              )
              add(cmd.x, cmd.y)
              break

            case 'S':
              if (prev) {
                if (prev.code === 'C') {
                  x1 = prev.x * 2 - prev.x2
                  y1 = prev.y * 2 - prev.y2
                } else {
                  x1 = prev.x
                  y1 = prev.y
                }
              }
              sampleCubicBézier(
                cmd.x0,
                cmd.y0,
                x1,
                y1,
                cmd.x2,
                cmd.y2,
                cmd.x,
                cmd.y
              )
              add(cmd.x, cmd.y)
              break

            default:
              console.error(
                'Our deepest apologies, but ' +
                  cmd.command +
                  ' commands (' +
                  cmd.code +
                  ') are not yet supported.'
              )
              process.exit(2)
          }
          prev = cmd
        })
        return polys

        function sampleCubicBézier(x0, y0, x1, y1, x2, y2, x3, y3) {
        const x01 = (x0 + x1) / 2,
            y01 = (y0 + y1) / 2,
            x12 = (x1 + x2) / 2,
            y12 = (y1 + y2) / 2,
            x23 = (x2 + x3) / 2,
            y23 = (y2 + y3) / 2,
            x012 = (x01 + x12) / 2,
            y012 = (y01 + y12) / 2,
            x123 = (x12 + x23) / 2,
            y123 = (y12 + y23) / 2,
            x0123 = (x012 + x123) / 2,
            y0123 = (y012 + y123) / 2

          const dx = x3 - x0,
            dy = y3 - y0

          const d1 = Math.abs((x1 - x3) * dy - (y1 - y3) * dx),
            d2 = Math.abs((x2 - x3) * dy - (y2 - y3) * dx)

          if ((d1 + d2) * (d1 + d2) < tolerance2 * (dx * dx + dy * dy))
            add(x0123, y0123)
          else {
            sampleCubicBézier(x0, y0, x01, y01, x012, y012, x0123, y0123)
            sampleCubicBézier(x0123, y0123, x123, y123, x23, y23, x3, y3)
          }
        }

        function add(x, y) {
          if (opts.decimals && opts.decimals >= 0) {
            x = x.toFixed(opts.decimals) * 1
            y = y.toFixed(opts.decimals) * 1
          }
          poly.push([x, y])
        }
      }

      function compare(pathData, opts = {}) {
        var polys = svgPathToPolygons(pathData, opts)
        var minX = Infinity,
          maxX = -Infinity,
          minY = Infinity,
          maxY = -Infinity,
          cx,
          cy
        polys.forEach((poly) => {
          poly.forEach((pt) => {
            if (pt[0] < minX) minX = pt[0]
            if (pt[1] < minY) minY = pt[1]
            if (pt[0] > maxX) maxX = pt[0]
            if (pt[1] > maxY) maxY = pt[1]
          })
        })
       
        return `
  <g id="${svgData.id}">
  ${polys
    .map((poly) => {
      const cxArr = []
      const cyArr = []
      poly.forEach((el) => {
        cxArr.push(el[0])
        cyArr.push(el[1])
      })
      cx = (
        (Math.max.apply(null, cxArr) + Math.min.apply(null, cxArr)) /
        2
      ).toFixed(3)
      cy = (
        (Math.max.apply(null, cyArr) + Math.min.apply(null, cyArr)) /
        2
      ).toFixed(3)
      return `  <${
        poly.closed ? 'polygon' : 'polyline'
      } fill="none" stroke="#000000" stroke-miterlimit="10" points="${poly.join(
        ' '
      )}  "/>`
    })
    .join('\n')}
  <circle fill="none" stroke="#EAC613" stroke-miterlimit="10" cx="${cx}" cy="${cy}" r="8.083"/>
  </g>
  `.trim()
      }

      let str = compare(`${svgData.path}`)

      this.list += str
    },

通过这里获取init函数在控制台获取到的就是我们需要的矢量地图(大概就是这样)直接粘贴到 svg2geojson  的svg 中,可以直接覆盖他的zhongshan.svg的内容,也可以自己新建一个svg然后粘贴进去,然后运行 gulp 

 在dist 中就可以获取到想要的 genjson 数据了。可以在echarts,g6 等其他的可视化工具使用了。

生成的文件是没有 code 码 的,要用的话需要手动配置了。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 数据可视化是指利用图表、图形等形式,将数据进行图形化展示和解读的过程。而GIS(Geographic Information System,地理信息系统)则是利用计算机技术来存储、分析、管理和展示地理空间信息的系统。 在数据可视化中,GIS地图分析可以提供更直观和准确的空间数据展示和分析。通过将数据地图相结合,可以更清晰地展示地理空间的分布、关系和变化趋势,帮助人们更好地理解和解读数据。 CSDN作为中国最大的IT技术社区,提供了大量的数据可视化和GIS地图分析相关的文章和教程。在CSDN上,你可以找到许多关于数据可视化和GIS地图分析的技术、方法和案例的文章和资料。通过学习这些内容,你可以了解数据可视化和GIS地图分析的基本概念和原理,掌握相关的工具和技术,提高自己在这方面的能力。 在实际应用中,数据可视化和GIS地图分析在各个领域都有广泛的应用。在城市规划中,可以通过可视化和地图分析来评估交通拥堵情况、资源分布等问题;在环境保护中,可以利用数据可视化地图分析来监测污染源、分析环境变化等;在商业分析中,可以通过地理空间的可视化和分析来评估市场潜力、进行竞争对手分析等。 总之,数据可视化和GIS地图分析是当今信息化时代重要的技术手段,CSDN作为IT技术社区提供了丰富的相关资源,帮助人们学习和应用这些技术,促进技术的创新和发展。 ### 回答2: 数据可视化是一种通过图表、图像、地图等方式将数据呈现出来的方法。地理信息系统(GIS)是一种将地理数据与其他信息相结合的技术,可以对地理数据进行分析、管理和展示。CSDN是一个专业的IT社区,提供了大量关于计算机科学和技术的在线资源和互动交流。 在数据可视化方面,GIS地图分析在CSND上具有重要意义。首先,通过GIS地图分析,我们可以将大量的地理数据呈现在地图上,使得这些数据更加直观和易于理解。例如,我们可以将销售数据与地理位置相结合,在地图上展示出销售热点区域和销售额分布。这样的可视化分析可以帮助企业更好地了解市场需求和消费行为,从而做出更为准确和科学的决策。 其次,GIS地图分析可以帮助我们发现地理空间上的规律和趋势。通过对地理数据的统计和分析,我们可以得出一些重要的结论和认识,例如人口分布、土地利用、交通网络等。这些结论和认识可以帮助我们更好地规划城市、保护环境和改善生活质量。在CSND上分享和交流这些GIS地图分析的成果,可以促进更多人了解和参与城市规划和环境保护等工作。 此外,GIS地图分析还可以与其他数据分析方法相结合,例如统计分析、机器学习等。通过将不同类型的数据进行融合和分析,我们可以得到更加全面和深入的认识。在CSND上,我们可以发布关于GIS地图分析和其他数据分析方法相结合的案例和经验,推动学术界和业界之间的交流和合作。 总之,数据可视化GIS地图分析在CSND上具有重要的意义,可以帮助我们更好地理解和利用地理数据,促进城市规划和环境保护等工作的发展。同时,通过在CSND上分享和交流这方面的经验和成果,可以促进学术界和业界之间的合作和创新。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值