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

news2024/11/20 14:14:51

本文用纯前端获取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>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

目标检测C-RNN,Fast C-RNN,Faster C-RNN,SSD,Mask R-CNN 理论简单介绍

参考&#xff1a; https://zh-v2.d2l.ai/chapter_computer-vision/multiscale-object-detection.html R-CNN 及系列 区域卷积神经网络 region-based CNN R-CNN R-CNN首先从输入图像中选取若干&#xff08;例如2000个&#xff09;提议区域&#xff0c;并标注它们的类别和边界…

两个笔记本如何将一个笔记本作为另一个笔记本的拓展屏

需求是有两个笔记本&#xff0c;一个笔记本闲置&#xff0c;另一个笔记本是主力本。想将另一个闲置的笔记本连接到主力本上作为拓展屏使用。网上搜了好久&#xff0c;有一些人提到了&#xff0c;也有一些视频但是文章比较少。简单总结一下吧 上述需求有两种方式 第一种&#x…

学习vue3第五节(reactive 及其相关)

1、定义 reactive() 创建一个响应式代理对象&#xff0c;不同于ref()可以创建任意类型的数据&#xff0c;而reactive()只能是对象&#xff0c;会响应式的深层次解包任何属性&#xff0c;将其标注为响应式 响应式是基于ES6的proxy实现的代理对象&#xff0c;该proxy对象与原对象…

【C++】C++的初步认识

&#x1f338;博主主页&#xff1a;釉色清风&#x1f338;文章专栏&#xff1a;C&#x1f338;今日语录&#xff1a;自律以修身&#xff0c;自省以观己。自学以长识&#xff0c;自处以蓄力。 &#x1f33b;Hi~大家好&#xff0c;这次文章是C的初步认识&#xff0c;包括从C语言到…

【LeetCode: 2864. 最大二进制奇数 + 模拟 + 位运算】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

基于SSH的物流配送管理系统的设计与实现

摘 要 当今社会&#xff0c;物流配送已成为影响经济发展的显著因素。而随着社会信息化发展&#xff0c;建立有效的物流配送管理体系不仅能够减少物流成本&#xff0c;更能够提升工作人员的工作效率与客户的满意度。而基于B/S架构的物流配送管理体系&#xff0c;不仅具有良好的…

Navicat操作MYSQL

Navicat操作MYSQL 数据表的操作-创建表数据表的操作-修改、删除表数据的操作数据类型与约束常用数据类型数据约束 数据库备份与还原数据库的备份数据表的还原 数据表的操作-创建表 数据表的操作-修改、删除表 数据的操作 数据类型与约束 常用数据类型 整型&#xff1a;int 有符…

这是一份简单到没朋友的上手图数据库的图文教程

前几天和社区小伙伴友好交流&#xff08;闲聊&#xff09;&#xff0c;不少加入 NebulaGraph 的小伙伴虽然对图感兴趣&#xff0c;但是因为业务调整或者是时间缘故&#xff0c;最终没能用上 NebulaGraph。而他们当中不少的小伙伴说&#xff0c;春节我打算好好学习一番。既然大家…

打造你的HTML5打地鼠游戏:零基础入门教程

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

mysql基于mycat实现读写分离

试验环境 基于mysql主从复制已经实现 mycat主机192.168.199.149&#xff0c;安装好java和jdk 数据库主机192.168.199.150 数据库从机192.168.199.151 149配置 下载mycat并解压 vim /root/mycat/conf/server.xml vim /root/mycat/conf/schema.xml 150是主数据库&#xff0…

[Linux][CentOs][Mysql]基于Linux-CentOs7.9系统安装并配置开机自启Mysql-8.0.28数据库

目录 一、准备工作&#xff1a;获取安装包和相应工具 &#xff08;一&#xff09;所需安装包 &#xff08;二&#xff09;安装包下载链接 &#xff08;三&#xff09;在服务器上创建文件夹并上传安装包 二、安装MySql &#xff08;一&#xff09;删除系统自带的mariadb …

OceanBase原理之内存管理

第1章 前言 1.1 多租户管理简介 OceanBase数据库中&#xff0c;应用了单集群多租户的设计&#xff0c;使得一个集群内能够创建多个彼此独立的租户。在OceanBase数据库&#xff0c;租户成为了资源分配的单位&#xff0c;同时还是数据库对象管理和资源管理的基础。 在某种程度…

代码随想录算法训练营Day44 ||leetCode 完全背包 || 518. 零钱兑换 II || 377. 组合总和 Ⅳ

完全背包 518. 零钱兑换 II 遍历硬币和金额&#xff0c;累加所有可能 class Solution { public:int change(int amount, vector<int>& coins) {vector<int> dp(amount1,0);dp[0]1;for (int i 0; i < coins.size();i){for(int j coins[i]; j < amount;…

安装PyTorch详细过程

安装anaconda 登录anaconda的官网下载&#xff0c;anaconda是一个集成的工具软件不需要我们再次下载。anaconda官网 跳转到这个页面如果你的Python版本正好是3.8版&#xff0c;那便可以直接根据系统去选择自己相应的下载版本就可以了。 但是如果你的Python版本号不是当前页面…

linux驱动——中断

1.Cortex-A系列的中断的简介 中断的基本概念&#xff1a;(interrupt) 中断本质上是系统内部的异常机制,当中断产生之后&#xff0c;他会停下当前正在执行的任务&#xff0c;转而去做其他的事情,在停下当前正在执行的任务之前,要先入栈&#xff08;保护现场,其他的事情做完之后…

漏洞原理 | CORS跨域学习篇

0x01&#xff1a;原理 1、 什么是CORS 全称跨域资源共享&#xff0c;用来绕过SOP(同源策略)来实现跨域访问的一种技术。 CORS漏洞利用CORS技术窃取用户敏感信息 2、 同源策略简介 同源策略是浏览器最核心也是最基本的安全功能&#xff0c;不同源的客户端脚本在没有明确授权…

UDP连接树莓派时提高连接速度,降低卡顿感

背景 树莓派4B刷的是ubuntu20.4系统&#xff0c;使用win10自带的远程桌面连接和其连接&#xff0c;卡的一批&#xff0c;于是探索并记录下如何降低连接卡顿感 步骤一 点击显示选项&#xff0c; 降低显示配置和颜色深度&#xff1a; 步骤二 我的树莓派是通过电脑移动热点的方式…

中科大计网学习记录笔记(十八):网络层:数据平面:导论

前言&#xff1a; 学习视频&#xff1a;中科大郑烇、杨坚全套《计算机网络&#xff08;自顶向下方法 第7版&#xff0c;James F.Kurose&#xff0c;Keith W.Ross&#xff09;》课程 该视频是B站非常著名的计网学习视频&#xff0c;但相信很多朋友和我一样在听完前面的部分发现信…

今天做了两个工具

URL可用性检测 2.影视 第一个工具为第二个工具服务&#xff0c;一定程度上检测了搜集到视频解析接口是否可用。

AI知识库也太方便了吧,中小型企业都要知道它!

生活在这个信息爆炸的时代&#xff0c;信息的获取变得前所未有的方便&#xff0c;但随之而来的却是信息筛选和管理的难题。对于中小型企业来说&#xff0c;如何有效运用自身积累的各类信息&#xff0c;直接影响着企业的运营效率和市场竞争力。而这&#xff0c;正是AI知识库可以…