利用GeoWave导入矢量数据到HBase/Accumulo数据库

news2024/12/14 10:25:54

前言

最近在做有关地理时空大数据的实验,本文将介绍如何利用geowave框架,将矢量数据导入到HBase或Accumulo等NoSQL数据库中。

软件版本:

Hadoop: 2.10.2

Zookeeper: 3.6.4

geowave: 1.2.0

Accumulo:1.9.3

HBase: 1.4.0

Java: 1.8

准备工作

从GeoWave官网下载geowave-hbase-1.2.0-apache.jar导入到HBase的lib文件夹下。(Accumulo数据库导入geowave-accumulo-1.2.0-apache-accumulo1.7.jar包)

代码

1、引入依赖

<dependency>
    <groupId>org.locationtech.geowave</groupId>
    <artifactId>geowave-datastore-hbase</artifactId>
    <version>1.2.0</version>
</dependency>
<dependency>
    <groupId>org.locationtech.geowave</groupId>
    <artifactId>geowave-adapter-vector</artifactId>
    <version>1.2.0</version>
</dependency>
<dependency>
    <groupId>org.locationtech.geowave</groupId>
    <artifactId>geowave-format-vector</artifactId>
    <version>1.2.0</version>
</dependency>
<dependency>
    <groupId>org.locationtech.geowave</groupId>
    <artifactId>geowave-datastore-accumulo</artifactId>
    <version>1.2.0</version>
</dependency>
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>4.6.10</version>
</dependency>
<dependency>
    <groupId>org.apache.accumulo</groupId>
    <artifactId>accumulo-core</artifactId>
    <version>1.9.3</version>
</dependency>

2、HBase数据库导入矢量数据

本文选取AIS数据,文件为JSON格式如下:

 首先需要写代码构建SimpleFeatureTypeBuilder对象,该对象用于创建SimpleFeatureType,其实 用于定义你的矢量数据的Geometry类型,有哪些属性字段。

public static SimpleFeatureTypeBuilder getSimpleFeatureBuilder (String typeName) throws IOException, JSONException {

        // 创建 SimpleFeatureTypeBuilder 对象
        SimpleFeatureTypeBuilder featureTypeBuilder = new SimpleFeatureTypeBuilder();
        AttributeTypeBuilder attributeBuilder = new AttributeTypeBuilder();

        featureTypeBuilder.add(attributeBuilder.binding(Point.class).nillable(false).buildDescriptor("the_geom"));
        // 添加属性
        featureTypeBuilder.add("uuid", String.class);
        featureTypeBuilder.add("mmsi", Integer.class);
        featureTypeBuilder.add("timestamp", Date.class);
        featureTypeBuilder.add("system_timestamp", Date.class);
        featureTypeBuilder.add("nav_status", Integer.class);
        featureTypeBuilder.add("rot", Double.class);
        featureTypeBuilder.add("sog", Double.class);
        featureTypeBuilder.add("pos_acc", Double.class);
        featureTypeBuilder.add("longitude", Double.class);
        featureTypeBuilder.add("latitude", Double.class);
        featureTypeBuilder.add("cog", Double.class);
        featureTypeBuilder.add("true_head", Double.class);
        featureTypeBuilder.add("eta", String.class);
        featureTypeBuilder.add("destid", Integer.class);
        featureTypeBuilder.add("dest", String.class);
        featureTypeBuilder.add("srcid", Integer.class);
        featureTypeBuilder.add("distance", Double.class);
        featureTypeBuilder.add("speed", Double.class);
        featureTypeBuilder.add("draught", Double.class);
        featureTypeBuilder.add("ship_type", Integer.class);
        featureTypeBuilder.setCRS(DefaultGeographicCRS.WGS84);
        featureTypeBuilder.setName(typeName);

        return featureTypeBuilder;
    }

导入数据,这里的typeName参数是定义矢量数据名称,indexName参数定义索引名称

public static void IngestData(String typeName, String indexName) throws
            IOException, JSONException, ParseException {
        HBaseRequiredOptions hBaseRequiredOptions = new HBaseRequiredOptions();
        //Zookeeper IP
        hBaseRequiredOptions.setZookeeper("localhost:2181");
        HBaseDataStore hBaseDataStore = (HBaseDataStore) 
                    DataStoreFactory.createDataStore(hBaseRequiredOptions);
        // JSON 数据 文件路径
        String filePath = "D:\\轨迹数据\\5h.json";

        long startTimeStamp = System.currentTimeMillis();

        // 转换 JSON 文件为 SimpleFeatureType
        SimpleFeatureTypeBuilder featureTypeBuilder = getSimpleFeatureBuilder(typeName);
        SimpleFeatureType pointType = featureTypeBuilder.buildFeatureType();

        //创建SimpleFeatureBuilder
        SimpleFeatureBuilder pointFeatureBuilder = new SimpleFeatureBuilder(pointType);

        // Create an adapter for point type
        FeatureDataAdapter pointTypeAdapter = new FeatureDataAdapter(pointType);

        //创建索引
        Index spatialTemporalIndex = new SpatialTemporalIndexBuilder()
                .setMaxDuplicates(-1)
                .setNumPartitions(3)
                .setPeriodicity(TemporalBinningStrategy.Unit.DAY)
                .setPartitionStrategy(IndexPluginOptions.PartitionStrategy.HASH)
                .setName(indexName).createIndex();

        //Add the point type to the data store in the spatial index
        hbaseStore.addType(pointTypeAdapter, spatialTemporalIndex);
        hbaseStore.getIndexStore().addIndex(spatialTemporalIndex);
        Writer<SimpleFeature> writer = hbaseStore.createWriter(pointTypeAdapter.getTypeName());

        // 读取 JSON 文件
        BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
        String line;

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");

        while ((line = bufferedReader.readLine()) != null) {
            JSONObject jsonObject = JSONObject.parseObject(line);
            // Write some features to the data store
            GeometryFactory factory = new GeometryFactory();

            String uuId = jsonObject.get("uuid").toString();
            String mmsi = jsonObject.get("mmsi").toString();

            pointFeatureBuilder.set("the_geom", factory.createPoint(new Coordinate(Double.parseDouble(jsonObject.get("longitude").toString()),
                    Double.parseDouble(jsonObject.get("latitude").toString()))));

            pointFeatureBuilder.set("uuid", uuId);

            pointFeatureBuilder.set("mmsi", mmsi);

            String timestamp_str = jsonObject.get("timestamp").toString();
            pointFeatureBuilder.set("timestamp", sdf.parse(timestamp_str));

            String system_timestamp_str = jsonObject.get("system_timestamp").toString();
            pointFeatureBuilder.set("system_timestamp", sdf.parse(system_timestamp_str));

            pointFeatureBuilder.set("nav_status", jsonObject.get("nav_status"));
            pointFeatureBuilder.set("rot", jsonObject.get("rot"));
            pointFeatureBuilder.set("sog", jsonObject.get("sog"));
            pointFeatureBuilder.set("pos_acc", jsonObject.get("pos_acc"));
            pointFeatureBuilder.set("cog", jsonObject.get("cog"));
            pointFeatureBuilder.set("true_head", jsonObject.get("true_head"));
            pointFeatureBuilder.set("eta", jsonObject.get("eta"));
            pointFeatureBuilder.set("destid", jsonObject.get("destid"));
            pointFeatureBuilder.set("dest", jsonObject.get("dest"));
            pointFeatureBuilder.set("srcid", jsonObject.get("srcid"));
            pointFeatureBuilder.set("distance", jsonObject.get("distance"));
            pointFeatureBuilder.set("speed", jsonObject.get("speed"));
            pointFeatureBuilder.set("draught", jsonObject.get("draught"));
            pointFeatureBuilder.set("ship_type", jsonObject.get("ship_type"));
            //取UUID 前三位 + 后三位  + 船舶编号
            String id = uuId.substring(0, 3) + uuId.substring(uuId.length() -3) + "-" + mmsi;
            writer.write(pointFeatureBuilder.buildFeature(id));
        }
        System.out.println("ingest finished!!!!");
        Long endTimeStamp = System.currentTimeMillis();
        System.out.println("导入耗时:" + (endTimeStamp - startTimeStamp) + "毫秒");
        bufferedReader.close();
        writer.flush();
        writer.close();
    }

3、Accumulo数据库导入矢量数据

代码和上面基本相同,把HBaseDataStore换成AccumuloDataStore即可。

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

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

相关文章

常回家看看之Tcache Stashing Unlink Attack

前言&#xff1a; 在开始了解这个攻击手法的前提&#xff0c;需要先了解一个函数也就是calloc函数&#xff0c;众所周知&#xff0c;当libc版本大于等于2.27的时候会引入tcachebin&#xff0c;而Tcache Stashing Unlink Attack就是发生在2.27版本以上&#xff0c;那么这个和ca…

心情追忆- SEO优化提升用户发现率

之前&#xff0c;我独自一人开发了一个名为“心情追忆”的小程序&#xff0c;旨在帮助用户记录日常的心情变化及重要时刻。我从项目的构思、设计、前端&#xff08;小程序&#xff09;开发、后端搭建到最终部署。经过一个月的努力&#xff0c;通过群聊分享等方式&#xff0c;用…

深入探索:createThread与cancelThread的用法及实例

在多线程编程领域,线程的创建与管理是核心技能之一。本文将详细介绍两个关键函数:createThread(用于创建新线程)和cancelThread(用于取消已存在的线程),并通过具体实例展示它们的用法。需要注意的是,不同的编程语言和线程库可能有不同的API设计,但基本概念是相通的。本…

Cherno C++学习笔记 P36 初始化类成员

这一篇文章我们主要讲一下如何初始化类成员&#xff0c;并给出一个初始化类成员的小技巧。我们都知道&#xff0c;我们会使用构造函数来初始化我们的类成员变量。 首先我们来举一个简单的小例子&#xff0c;展现一下构造函数的功能&#xff1a; #include<iostream> #in…

快速解决git@github.com: Permission denied (publickey)

在使用github进行项目克隆的时候&#xff0c;有些时候会出现“gitgithub.com: Permission denied (publickey)”的错误。这个问题大部分是由于新设备本地密钥未加入gitbub列表中&#xff0c;我们可以通过加入新机器身份验证解决问题。 一、问题现象 二、问题解决 2.1&#xf…

移动端h5自适应rem适配最佳方案

网页开发中&#xff0c;我们常用的单位有如下几个&#xff1a; px&#xff1a;像素固定&#xff0c;无法适配各分辨率的移动设备em: 该单位受父容器影响&#xff0c;大小为父元素的倍数rem: 因为html根元素大小为16px&#xff0c;所以默认 1rem 16px&#xff0c;rem只受根元素…

C语言程序设计P5-5【应用函数进行程序设计 | 第五节】—知识要点:变量的作用域和生存期

知识要点&#xff1a;变量的作用域和生存期 视频&#xff1a; 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 有一个一维数组&#xff0c;内放 10 个学生成绩&#xff0c;写一个函数&#xff0c;求出平均分、最高分和最低分。 任务要求用一个函数来完…

Jenkins与SonarQube持续集成搭建及坑位详解

Jenkins和SonarQube都是软件开发过程中常用的工具,它们在代码管理、构建、测试和质量管理方面发挥着重要作用。以下是关于Jenkins与SonarQube的作用及整合步骤环境搭建的详细解释: 一、Jenkins与SonarQube的作用 Jenkins: Jenkins是一个开源的持续集成和交付工具,它可以帮…

item2 for macos

安装Item2 brew install iterm2 查看终端类型 cat /etc/shells Mac OS X 10.15 已经将默认的shell从Bash换成了zsh&#xff0c;所以不用安装&#xff0c;10.15以前的可以使用下面的命令进行安装 brew install zsh 安装Oh My ZSH # curl sh -c "$(curl -fsSL https://ra…

[搜广推]王树森推荐算法——基于物体的协同过滤

基于物体的协同过滤 ItemCF 基于物体的协同过滤&#xff08;Item-Based Collaborative Filtering&#xff0c;简称ItemCF&#xff09;是一种经典的推荐系统算法 基本思想 量化用户对物品的兴趣&#xff0c;通过分析用户的行为来找到与目标物品相似的其他物品&#xff0c;然后…

3D 生成重建035-DiffRF直接生成nerf

3D 生成重建035-DiffRF直接生成nerf 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 本文提出了一种基于渲染引导的三维辐射场扩散新方法DiffRF&#xff0c;用于高质量的三维辐射场合成。现有的方法通常难以生成具有细致纹理和几何细节的三维模型&#xff0c;并且容易出…

计算机毕业设计Python+CNN卷积神经网络高考推荐系统 高考分数线预测 高考爬虫 协同过滤推荐算法 Vue.js Django Hadoop 大数据毕设

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

linux - 存储管理

1.了解硬件 -- 磁盘 硬盘有机械硬盘(HDD)和固态硬盘(SDD) 接下来&#xff0c;主要以机械磁盘为例(更具代表性&#xff0c;在linux系统层面&#xff0c;无论是机械磁盘还是固态硬盘&#xff0c;文件的读取和写入都iNode(索引节点)管理文件的元数据和实际数据块) 1.盘片&#x…

打造高效的HIS与DAT文件解析工具

在工业数据采集和存储中&#xff0c;HIS 和 DAT 文件是非常常见的二进制数据格式。然而&#xff0c;解析这些固定块大小的二进制文件并将其转换为易读的 CSV 格式并非易事。本文将深入讲解如何使用 Python 和 PyQt5 打造一款图形化工具&#xff0c;轻松解析和转换这些文件&…

设计模式-装饰器模式(结构型)与责任链模式(行为型)对比,以及链式设计

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1.装饰器模式1.1概念1.2作用1.3应用场景1.4特点1.5类与对象关系1.6实现 2责任链模式2.1概念2.2作用2.3应用场景2.4特点2.5类与对象关系2.6实现 3.对比总结 前言…

【JavaEE】网络(2)

一、网络编程套接字 1.1 基础概念 【网络编程】指网络上的主机&#xff0c;通过不同的进程&#xff0c;以编程的方式实现网络通信&#xff1b;当然&#xff0c;我们只要满足进程不同就行&#xff0c;所以即便是同一个主机&#xff0c;只要是不同进程&#xff0c;基于网络来传…

题海拾贝:力扣 141.环形链表

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 1、题…

SEC_ASA 第二天作业

拓扑 按照拓扑图配置 NTP&#xff0c;Server端为 Outside路由器&#xff0c;Client端为 ASA&#xff0c;两个设备的 NTP传输使用MD5做校验。&#xff08;安全 V4 LAB考点&#xff09; 提示&#xff1a;Outside路由器作为 Server端要配置好正确的时间和时区&#xff0c;ASA防…

IDEA 未启用lombok插件的Bug

项目中maven已引用了lombok依赖&#xff0c;之前运行没有问题的&#xff0c;但有时启动会提示&#xff1a; java: You arent using a compiler supported by lombok, so lombok will not work and has been disabled. Your processor is: com.sun.proxy.$Proxy8 Lombok support…

markdown入门

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…