shp文件显示 c语言,上传并在地图中显示Shp文件
前段时间参与了一个项目,客户有一个功能需求是上传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文件相关推荐
- 上传并在地图中显示Shp文件
前段时间参与了一个项目,客户有一个功能需求是上传SHP文件并在地图上显示,然后在此基础上做缓冲区处理.经过对比测试,最终选择了shapefile.js工具,在此做个记录. shapfe.js能够将Es ...
- 如何将本地文件利用git工具上传到github仓库中(超详细+最新版)
https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) 如何将本地文件利用 ...
- 为什么css效果在本地测试没问题,上传到服务器后却显示位置乱动,css下拉菜单本地正常,上传后360浏览器中显示错位,火狐、IE8显示正常...
匿名用户 1级 2014-04-15 回答 首先你使用 #header .row-2 ul li:hover 这样ie6就不支持了.ie6支持的hover目前我知道的只有a标签. 要单纯用css实现下 ...
- linux上传oracle压缩包,Linux中从oracle官网下载jdk文件不是标准的gzip格式文件问题...
http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-lin ...
- input type='file' 上传文件时显示文件名及上传进度
https://blog.csdn.net/qq_36687640/article/details/78551217 1.input type='file' 上传文件时显示文件名及上传进度 <i ...
- shp文件纯前端的上传、解析、编辑、下载
本文主要讲述一种体量较小的shp文件纯前端的上传.解析.编辑.下载的技术流程,适用于要素量少的shp文件修改操作. 准备工作 下载一下几个包,详细用法请见结尾参考. npm install file- ...
- asp如何将图片文件上传到mysql数据库中_怎样才能利用ASP把图片上传到数据库
欢迎来到小编的文章进行学习阅读,想必大家又有很多问题吧,在这里会有你想要收获的答案,请大家慢慢学习吧! ASP(Active Server Pages)是Microsoft很早就推出的一种WEB应用程 ...
- win10 ftp服务器无法上传文件,win10ftp服务器如何上传文件
win10ftp服务器如何上传文件 内容精选 换一换 华为云帮助中心,为用户提供产品简介.价格说明.购买指南.用户指南.API参考.最佳实践.常见问题.视频帮助等技术文档,帮助您快速上手使用华为云服务 ...
- ajax文件插件上传,7 款基于 JavaScript/AJAX 的文件上传插件
本文整理了7款基于JavaScript和AJAX的文件上传插件,这些插件基本上都能实现以下功能: 多文件上传 拖拽操作 实时上传进度 自定义上传限制 希望能为你的开发工作带来帮助. 具有多文件上传.拖 ...
最新文章
- 5G:新基建的压舱石,如何为新基建按下“加速键”?
- 安装Phoenix时./sqlline.py执行报错File ./sqlline.py, line 27, in module import argparse ImportError: No ...
- python做马里奥_python实现超级马里奥
- [转]阿里巴巴集团去IOE运动的思考与总结
- 单元测试(三)基本使用
- VMware “Transport(VMDB)error -44:Message”
- cxf整合spring发布webservices服务端
- 基于时空网络的出租车OD需求预测-模型框架(附数据集下载方式)
- 回调函数透彻理解Java
- ansys中ex是什么意思_ansys命令流mp,ex
- 器件选型-OLED液晶显示原理和选型
- 初创企业适用的邮件群发软件
- pta森森快递(线段树 + 贪心 + 区间修改)
- vs code 快速生成html模板插件
- recycler上下拉刷新view
- 云服务器和域名的购买—华为云
- 如何通透理解:BFS和DFS优先搜索算法(23年修订版)
- 榕树说技术支持(Rong Zhiyun technical support)
- MySQL事务相关知识
- 创业公司失去了增长,你啥也不是!|【常垒·常识】
热门文章
- 解决win7 anaconda 安装 Failed to create menus
- 05.尚硅谷网课5-样式继承与其他概念
- 眼花缭乱中看Metro Style—MS Apps Store—Desktop Apps以及Win-Runtime和Win32
- 让进度条颜色渐变的shader
- 个人日记-《学习究竟是什么》读后感-2020/6/21
- Docker深入浅出系列 | 容器初体验
- 3.表数据的CRUD
- 网络基础知识:10M、50M、100M宽带下载速率一般是多少?—Vecloud微云
- [Leetcode] 625. Minimum Factorization 解题报告
- 如何在小程序中直接跳到关注微信公众号页面