应用工程中获取Shapefile文件的图形信息并显示

本文用纯前端获取shp文件以及前后端交互的方式获取Shapefile文件中的图形信息

1.案例说明

在日常的WebGIS开发中,我们往往会面对,需要用户选择矢量数据,通过矢量数据中的空间范围信息,显示在界面上,并给用户的下一步操作提供一定意义上的数据基础。

在上述的描述上我们会接收到如下数据

  • WKT、GeoJSON字符串
  • Shape file文件
  • GDB文件

本文我们来看看Shapefile文件,关于Shapefile可以参考此文什么是shapefile文件_shapefile和kml最多能存多少个点-CSDN博客

2.技术实现

本文只对Shapefile文件进行技术实现,Shapefile文件相较比较简单,因为有开源标准所以第三方包比较多。

本文提供两种解决方案

  • 前端选择Shapefile相关文件,将文件上传到后端,后端使用相关技术解析,使用WKT或者GeoJson返回
  • 纯前端解析Shape file文件

本文的两种方案均可以只解析[.shp]文件,而不需要文件组。

2.1. 前后端衔接

此处就不说明前端如何传输文件了。后端使用Java技术栈(后续有时间研究一下C#中是否存在相同的技术方案。)

Java使用Geotools可以直接解析Shapefile文件,并且可以只解析Shp文件,而不需要同级目录下有其他相关的文件。

import org.geotools.data.FileDataStore;  
import org.geotools.data.FileDataStoreFinder;  
import org.geotools.data.shapefile.shp.ShapefileReader;  
import org.geotools.data.simple.SimpleFeatureSource;  
import org.geotools.data.simple.SimpleFeatureIterator;  
import org.opengis.feature.simple.SimpleFeature;  
  
import java.io.File;  
import java.io.IOException;  
  
public class ReadShapefileMain {  
  
    public void readShp(String path) {  
        File file = new File(path);  
        FileDataStore store = null;  
        SimpleFeatureIterator iterator = null;  
        try {  
            store = FileDataStoreFinder.getDataStore(file);  
            SimpleFeatureSource featureSource = store.getFeatureSource();  
            iterator = featureSource.getFeatures().features();  
  
            while (iterator.hasNext()) {  
                SimpleFeature feature = iterator.next();  
                // 这里你可以访问 feature 的几何数据  
                System.out.println(feature.getDefaultGeometry());  
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        } finally {  
            if (iterator != null) {  
                iterator.close();  
            }  
            if (store != null) {  
                store.dispose();  
            }  
        }  
    }  
  
    public static void main(String[] args) {  
        ReadShapefileMain reader = new ReadShapefileMain();  
        reader.readShp("C:\\Users\\HTHT\\Desktop\\1\\12\\320312.shp");  
    }  
}

在这里插入图片描述
在这里插入图片描述

如果需要合并所有图形并修改图形的表达方式可以使用Geotools中的JTS进行相关的操作。

2.2.纯前端实现

如果需要在 JavaScript 中直接读取 .shp 文件(而不涉及 .dbf 文件),一个可能的解决方案是使用 shapefile 库,这是一个可以在 Node.js 和浏览器中使用的纯 JavaScript 库。它可以读取 .shp 文件并将其解析为 GeoJSON 格式。

npm install shapefile

要在 JavaScript 中将所有几何图形(如从 .shp 文件读取的)执行 Union 操作,我们可以使用 turf.js 库。turf.js 是一个强大的地理空间处理库,它提供了各种用于处理和分析空间数据的方法,包括 Union 操作。

npm install @turf/turf

在JavaScript中实现GeoJSON和WKT(Well-Known Text)格式之间的相互转换,你可以使用一些现有的库,如Terraformerwellknown

npm install terraformer terraformer-wkt-parser

前端代码

<template>
  <!-- 文件输入 -->
  <input type="file" @change="handleFileChange" />
</template>

<script>
import * as shapefile from 'shapefile';
import * as turf from 'turf';
import * as WKT from 'terraformer-wkt-parser';

export default {
  methods: {
    handleFileChange(event) {
      const file = event.target.files[0];
      this.readShpFile(file);
    },
    readShpFile(file) {
      const reader = new FileReader();
      reader.onload = (e) => {
        const arrayBuffer = e.target.result;
        shapefile.read(arrayBuffer)
          .then(geojson => {
            this.unionGeometries(geojson);
          })
      };
      reader.readAsArrayBuffer(file);
    },
    unionGeometries(geojson) {
      let combinedGeometry = null;
      geojson.features.forEach((feature, index) => {
        if (index === 0) {
          combinedGeometry = feature.geometry;
        } else {
          combinedGeometry = turf.union(turf.feature(combinedGeometry), feature).geometry;
        }
      });
      console.log('GeoJson---Geometry:', combinedGeometry);
      const wkt1 = WKT.convert(JSON.parse(JSON.stringify(combinedGeometry)));
      console.log(wkt1);
      console.log(JSON.stringify(WKT.parse(wkt1), null, 2));
    }
  }
};
</script>

2.3. 附:terraformer-wkt-parser 格式转换

<template>
  <div>
    <h2>GeoJSON and WKT Converter</h2>
    <textarea v-model="input" placeholder="Enter GeoJSON or WKT..."></textarea>
    <button @click="convert">Convert</button>
    <div v-if="output">
      <h3>Result</h3>
      <pre>{{ output }}</pre>
    </div>
  </div>
</template>

<script>
import * as WKT from 'terraformer-wkt-parser';

export default {
  name: 'GeoConverter',
  data() {
    return {
      input: '',
      output: ''
    };
  },
  methods: {
    convert() {
      try {
        if (this.input.trim().startsWith('{')) {
          // Assume it's GeoJSON
          const geoJson = JSON.parse(this.input);
          this.output = WKT.convert(geoJson);
        } else {
          // Assume it's WKT
          this.output = JSON.stringify(WKT.parse(this.input), null, 2);
        }
      } catch (error) {
        this.output = 'Error: ' + error.message;
      }
    }
  }
};
</script>

<style scoped>
	textarea {
	  width: 100%;
	  height: 100px;
	  margin-bottom: 10px;
	}
	
	pre {
	  background-color: #f0f0f0;
	  padding: 10px;
	}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/450004.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

wave库基本操作

wave 常见的语音信号处理python库有librosa, scipy, soundfile等等。wave库是python的标准库&#xff0c;对于python来说相对底层&#xff0c;wave不支持压缩/解压&#xff0c;但支持单声道/立体声语音的读取。 读取音频 import wavefile_path D:/ba.wav #文件路径 f wave…

数据库应用

约束 概念&#xff1a; 约束是一种限制&#xff0c;它通过对表的行或列的数据做出限制&#xff0c;来确保表的数据的正确性、完整性、有效性、唯一性。 分类&#xff1a; primary key&#xff1a;主键约束&#xff0c;指定某列的数据不能重复、唯一、非空。 not null&#…

QT----计算器

目录 1 搭建标准界面2、 逻辑编写2.1 初始化 github链接&#xff1a;基于qt的计算器 1 搭建标准界面 按照下图搭设界面 修改样式让这计算器看起来更像一点&#xff0c;同时对按钮分组进行样式编辑&#xff0c;添加字符串name,为number&#xff0c;其他按键为other。之前的文章…

Linux操作系统-07-Linux安装应用

一、使用rpm安装应用&#xff08;不推荐&#xff09; 先下载到本地&#xff0c;以.rpm文件名结尾&#xff0c;下载完成后&#xff0c;再安装 rpm -qa | grep mysql #查询当前系统是否有下载过mysql包 先上传mysql的rpm安装包到linux的opt目录 安装 rpm -ivh …

CVE-2024-27199 JetBrains TeamCity 身份验证绕过漏洞2

漏洞简介 TeamCity Web 服务器中发现了第二个身份验证绕过漏洞。这种身份验证旁路允许在没有身份验证的情况下访问有限数量的经过身份验证的端点。未经身份验证的攻击者可以利用此漏洞修改服务器上有限数量的系统设置&#xff0c;并泄露服务器上有限数量的敏感信息。 项目官网…

3D模型优化10个最佳实践

对于许多在建模、渲染和动画方面经验丰富的 3D 建模者来说&#xff0c;3D 优化可能是一个令人畏惧的过程 - 特别是当你正在优化实时应用程序的 3D 模型时&#xff01; 在 Google 上快速搜索“如何优化 3D 文件”将会出现一些建议&#xff0c;例如减少多边形数和消除多余的顶点。…

【MATLAB 】 EMD信号分解+FFT傅里叶频谱变换组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 展示出图效果 1 EMD信号分解算法 EMD 分解又叫经验模态分解&#xff0c;英文全称为 Empirical Mode Decomposition。 EMD 是一种信号分解方法&#xff0c;它将一个信号分解成有限个本质模态函数 (EMD) 的和&#xff0c…

马斯克宣布本周开源AI助手Grok;Gemini 1.5:多模态理解

&#x1f989; AI新闻 &#x1f680; 马斯克宣布本周开源AI助手Grok 摘要&#xff1a;马斯克通过X平台宣布&#xff0c;其人工智能公司xAI计划本周开源人工智能助手Grok。此前&#xff0c;马斯克因OpenAI及其CEO阿尔特曼违反了公司成立协议—推动AI技术为人类福祉而非利润而起…

Linux 多进程开发(上)

第二章 Linux 多进程开发 2.1 进程概述2.2 进程状态转换2.3 进程创建2.4 exec 函数族2.5 进程控制 网络编程系列文章&#xff1a; 第1章 Linux系统编程入门&#xff08;上&#xff09; 第1章 Linux系统编程入门&#xff08;下&#xff09; 第2章 Linux多进程开发&#xff08;…

PCL 约束Delaunay三角网(版本二)

目录 一、算法概述二、代码实现三、结果展示四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法概述 PCL 点云Delaunay三角剖分一文给出了PCL中Delaunay三角网算法的基础用法。本文在基础用法的基…

python 蓝桥杯 之 字符串

文章目录 题目一find(str,start,end) 函数 题目一 find(str,start,end) 函数 在Python中&#xff0c;find()函数用于在字符串中查找子字符串&#xff0c;并返回第一次出现的子字符串的索引。如果找不到子字符串&#xff0c;则返回-1。find()函数的语法如下&#xff1a; str.f…

少儿编程机器人技术架构解析与实现流程

随着科技的飞速发展&#xff0c;少儿编程机器人成为了越来越受欢迎的教育工具&#xff0c;为孩子们提供了学习编程的新途径。在这篇文章中&#xff0c;我们将深入探讨少儿编程机器人的技术架构和实现过程&#xff0c;揭示背后的技术原理和开发策略。同时&#xff0c;我们也将介…

visual studio 将编译后的dll等文件自动复制到指定目录

编译后的文件dll等总要手动复制到指定目录下&#xff0c;为了解决这一繁琐的操作&#xff0c;可以直接设置在编译完成后&#xff0c;自动复制到目标目录 - 在解决方案资源管理器&#xff0c;选中项目右键-》选中属性-》在弹出的面板选择生成事件 - 在后期生成事件命令行里填写…

Vue3全家桶 - VueRouter - 【3】嵌套路由【children】

嵌套路由【children】 如果在路由视图中展示的组件包含自己的路由占位符&#xff08;路由出口&#xff09;&#xff0c;则此处会用到嵌套路由&#xff1b;如图所示&#xff1a;点击关于链接&#xff0c;则会展示About组件&#xff0c;在其组件中又包含了路由链接和路由占位符&…

Spring Cloud Alibaba微服务从入门到进阶(一)

Springboot三板斧 1、加依赖 2、写注解 3、写配置 Spring Boot Actuator Spring Boot Actuator 是 Spring Boot 提供的一系列用于监控和管理应用程序的工具和服务。 SpringBoot导航端点 其中localhost:8080/actuator/health是健康检查端点&#xff0c;加上以下配置&#xf…

用链表实现顺序表的插入和删除操作(操作封装在函数中)

#include <iostream> using namespace std; struct node{int val;node * next; }; void print(node * head){if(headNULL ||head->nextNULL){cout<<"链表中已经无元素";return;}cout<<"打印列表:";node * phead->next;while(p){co…

安卓bp文件详解

概念 Android.bp文件是安卓构建系统&#xff08;Android Build System&#xff09;中使用的构建描述文件&#xff0c;它用于定义Android项目中的模块、库、应用等构建规则&#xff0c;该文件使用 Blueprint 语言&#xff0c;是 Soong 构建系统的一部分。 Soong则是专为Android…

vue+elementUI用户修改密码的前端验证

用户登录后修改密码&#xff0c;密码需要一定的验证规则。旧密码后端验证是否正确&#xff1b;前端验证新密码的规范性&#xff0c;新密码规范为&#xff1a;6-16位&#xff0c;至少含数字/字母/特殊字符中的两种&#xff1b;确认密码只需要验证与新密码是否一致&#xff1b; 弹…

VMware17.5.1导入x.ova格式虚拟机

1、用的是2024年2月发布的VMware17.5.1 pro、导入的是VisualBox制作的ova。 2、VMware导入ova后&#xff0c;能正常进入虚拟机&#xff0c;并正常运行。 3、注意导入过程中会提示一个选择窗口&#xff0c;务必要点击“重试”&#xff0c;不要点击取消。

【JAVA重要知识 | 第七篇】Java异常知识总结(声明、抛出、捕获异常)

7.Java异常知识总结&#xff08;声明、抛出、捕获异常&#xff09; 7.1异常定义 在程序运行过程中&#xff0c;如果JVM检测出一个不可能执行的操作时&#xff0c;就会出现运行时错误&#xff08;runtime error&#xff09;。在Java中&#xff0c;运行时错误会作为异常抛出。异…