前段时间参与了一个项目,客户有一个功能需求是上传SHP文件并在地图上显示,然后在此基础上做缓冲区处理。经过对比测试,最终选择了shapefile.js工具,在此做个记录。

shapfe.js能够将Esri的Shapefile文件转换为GeoJSON,它能够以Shapefile文件zip的压缩文件和单独的.shp文件作为输入参数。

shapefile.js安装

项目是基于Vue开发的,因此选择了npm的安装方式,安装非常简单,执行下面的命令就可以了。

npm install shpjs

获取上传的SHP文件

在HTML中可使用type为file的input标签获取上传的.shp文件或者压缩后的Shapefile文件。

selectShpFile: function() {

this.shpFile = document.getElementById("uploadFileInput").files[0];

}

使用FileReader处理上传后的SHP文件

JavaScript中的FileReader用来读取Blob或者File的内容。

FileReader共包含4个方法,其中三个用来读取文件内容,一个用来打断读取。

方法名称

方法参数

方法描述

abort

中断文件读取

readAsBinaryString

File

将文件读取为二级制码

readAsDataURL

File

将文件读取为DataURL

readAsText

File, [encoding]

将文件读取为文本

FileReader处理事件共有6个,具体描述如下:

事件名称

事件描述

onabort

中断时触发

onerror

出错时触发

onload

文件读取成功时触发

onloadend

读取完成时触发,无论成功或失败

onloadstart

读取开始时触发

onprogress

读取中

这里需要注意的一点是,文件一旦开始读取,无论成功还是失败,实例的result属性都会被填充,也就是说如果读取失败,result的值为null,读取成功则为读取的结果。

在本项目中,我们使用了readAsBinaryString方法,并且监听onload事件获取文件的读取内容。

let fileReader = new FileReader();

fileReader.readAsArrayBuffer(shpFile);

fileReader.onload = function() {

// 获取读取的结果

console.log(this.result);

}

使用shapefile.js将SHP文件读取为GeoJSON

shapefile.js使用也非常简单,我们使用其read方法,并将上一步的文件的二进制读取结果作为read方法的参数,然后在其回调函数中获取GeoJson。

这一步和上一步的整合后的代码如下:

let fileReader = new FileReader();

fileReader.readAsArrayBuffer(shpFile);

fileReader.onload = function() {

let shapefile = require("shapefile");

shapefile

.read(this.result)

.then(geoJson => {

console.log(geoJson);

}

}

GeoJSON文件内容如下图所示:

在地图中加载GeoJson

在地图中加载GeoJson需要遍历其features属性,将其中的每个feature转为对应的几何对象(点、线或者面),然后将转换的几何对象构建成一个Graphic,最后将Graphic添加到GraphicLayer中。

遍历features,构建Polygon对象

geoJson.features.map(feature => {

const polygon = new EsriPolygon({

spatialReference: new EsriSpatialReference({ wkid: 2380 })

});

feature.geometry.coordinates.forEach(function(coord) {

const coordinates =

feature.geometry.type === "MultiPolygon" ? coord[0] : coord;

polygon.addRing(coordinates);

});

}

Polygon构建Graphic,并添加到GraphicLayer

let graphics = [];

let graphicsExtent = null;

geoJson.features.map(feature => {

const polygon = new EsriPolygon({

spatialReference: new EsriSpatialReference({ wkid: 2380 })

});

feature.geometry.coordinates.forEach(function(coord) {

const coordinates =

feature.geometry.type === "MultiPolygon" ? coord[0] : coord;

polygon.addRing(coordinates);

});

const graphic = new EsriGraphic({

geometry: polygon,

attributes: feature.properties,

symbol: {

type: "simple-fill", // autocasts as new SimpleFillSymbol()

color: [51, 51, 204, 0.9],

style: "solid",

outline: {

color: "white",

width: 1

}

}

});

graphics.push(graphic);

});

graphicLayer.addMany(graphics);

至此,我们已经完成了上传并在地图中展示SHP文件的整个流程,下一步就可以调用相应的API函数创建缓冲区,并执行接下来的各种功能。

shp文件显示 c语言,上传并在地图中显示Shp文件相关推荐

  1. 上传并在地图中显示Shp文件

    前段时间参与了一个项目,客户有一个功能需求是上传SHP文件并在地图上显示,然后在此基础上做缓冲区处理.经过对比测试,最终选择了shapefile.js工具,在此做个记录. shapfe.js能够将Es ...

  2. 如何将本地文件利用git工具上传到github仓库中(超详细+最新版)

    https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) 如何将本地文件利用 ...

  3. 为什么css效果在本地测试没问题,上传到服务器后却显示位置乱动,css下拉菜单本地正常,上传后360浏览器中显示错位,火狐、IE8显示正常...

    匿名用户 1级 2014-04-15 回答 首先你使用 #header .row-2 ul li:hover 这样ie6就不支持了.ie6支持的hover目前我知道的只有a标签. 要单纯用css实现下 ...

  4. linux上传oracle压缩包,Linux中从oracle官网下载jdk文件不是标准的gzip格式文件问题...

    http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-lin ...

  5. input type='file' 上传文件时显示文件名及上传进度

    https://blog.csdn.net/qq_36687640/article/details/78551217 1.input type='file' 上传文件时显示文件名及上传进度 <i ...

  6. shp文件纯前端的上传、解析、编辑、下载

    本文主要讲述一种体量较小的shp文件纯前端的上传.解析.编辑.下载的技术流程,适用于要素量少的shp文件修改操作. 准备工作 下载一下几个包,详细用法请见结尾参考. npm install file- ...

  7. asp如何将图片文件上传到mysql数据库中_怎样才能利用ASP把图片上传到数据库

    欢迎来到小编的文章进行学习阅读,想必大家又有很多问题吧,在这里会有你想要收获的答案,请大家慢慢学习吧! ASP(Active Server Pages)是Microsoft很早就推出的一种WEB应用程 ...

  8. win10 ftp服务器无法上传文件,win10ftp服务器如何上传文件

    win10ftp服务器如何上传文件 内容精选 换一换 华为云帮助中心,为用户提供产品简介.价格说明.购买指南.用户指南.API参考.最佳实践.常见问题.视频帮助等技术文档,帮助您快速上手使用华为云服务 ...

  9. ajax文件插件上传,7 款基于 JavaScript/AJAX 的文件上传插件

    本文整理了7款基于JavaScript和AJAX的文件上传插件,这些插件基本上都能实现以下功能: 多文件上传 拖拽操作 实时上传进度 自定义上传限制 希望能为你的开发工作带来帮助. 具有多文件上传.拖 ...

最新文章

  1. 5G:新基建的压舱石,如何为新基建按下“加速键”?
  2. 安装Phoenix时./sqlline.py执行报错File ./sqlline.py, line 27, in module import argparse ImportError: No ...
  3. python做马里奥_python实现超级马里奥
  4. [转]阿里巴巴集团去IOE运动的思考与总结
  5. 单元测试(三)基本使用
  6. VMware “Transport(VMDB)error -44:Message”
  7. cxf整合spring发布webservices服务端
  8. 基于时空网络的出租车OD需求预测-模型框架(附数据集下载方式)
  9. 回调函数透彻理解Java
  10. ansys中ex是什么意思_ansys命令流mp,ex
  11. 器件选型-OLED液晶显示原理和选型
  12. 初创企业适用的邮件群发软件
  13. pta森森快递(线段树 + 贪心 + 区间修改)
  14. vs code 快速生成html模板插件
  15. recycler上下拉刷新view
  16. 云服务器和域名的购买—华为云
  17. 如何通透理解:BFS和DFS优先搜索算法(23年修订版)
  18. 榕树说技术支持(Rong Zhiyun technical support)
  19. MySQL事务相关知识
  20. 创业公司失去了增长,你啥也不是!|【常垒·常识】

热门文章

  1. 解决win7 anaconda 安装 Failed to create menus
  2. 05.尚硅谷网课5-样式继承与其他概念
  3. 眼花缭乱中看Metro Style—MS Apps Store—Desktop Apps以及Win-Runtime和Win32
  4. 让进度条颜色渐变的shader
  5. 个人日记-《学习究竟是什么》读后感-2020/6/21
  6. Docker深入浅出系列 | 容器初体验
  7. 3.表数据的CRUD
  8. 网络基础知识:10M、50M、100M宽带下载速率一般是多少?—Vecloud微云
  9. [Leetcode] 625. Minimum Factorization 解题报告
  10. 如何在小程序中直接跳到关注微信公众号页面