基于Java的百度AOI数据解析与转换的实现方法

目录

前言

一、AOI数据结构简介

1、官网的实例接口

2、响应参数介绍

二、Java对AOI数据的解析

1、数据解析流程图

2、数据解析实现

3、AOI数据解析成果

三、总结


前言

        在当今信息化社会,地理信息数据在城市规划、交通管理、商业选址等领域扮演着越来越重要的角色。AOI(Area of Interest,兴趣面)数据作为地理信息数据的重要组成部分,能够提供区域状地理实体的详细边界信息,对于相关领域的研究和应用具有重要价值。百度地图作为地图服务提供商,其提供的AOI数据因其覆盖范围广、精度高、更新及时等特点,受到了众多企业和研究机构的青睐。然而,如何高效地解析和转换AOI数据,以便更好地满足不同应用场景的需求,成为了一个亟待解决的问题。基于Java的AOI数据解析与转换的实现方法,正是为了解决这一问题而提出的。

        Java作为一种成熟且广泛应用的编程语言,具有跨平台、面向对象、安全性高等特点,非常适合用于开发各种类型的应用程序。在地理信息数据处理领域,Java也有着广泛的应用,许多地理信息系统(GIS)软件和工具都是基于Java开发的。因此,利用Java来实现AOI数据的解析与转换,不仅能够充分发挥Java的优势,还能够方便地与现有的GIS系统进行集成和扩展。首先,基于Java的AOI数据解析与转换的实现方法需要对AOI数据的格式和结构有深入的了解。百度AOI数据通常以JSON格式提供,包含AOI的名称、类型、边界坐标等信息。其次,实现AOI数据的转换功能是该方法的核心部分。根据不同的应用场景需求,可能需要将AOI数据转换为其他格式,如GIS软件常用的Shapefile格式、KML、GeoJSON格式等,将转换后的数据为第三方服务平台提供数据输入。在Java中,可以使用一些开源的GIS库,如Geotools、JTS Topology Suite等,来实现AOI数据的转换。这些库提供了丰富的地理信息数据处理功能,可以方便地将AOI数据转换为所需的格式。此外,为了提高AOI数据解析与转换的效率和准确性,还可以采用一些优化策略。例如,可以对AOI数据进行预处理,去除重复或冗余的数据;在解析过程中,可以采用多线程技术来提高处理速度;在转换过程中,可以对数据进行适当的简化和优化,以减少数据量和提高转换效率。同时,还可以结合一些GIS分析工具和算法,对转换后的AOI数据进行进一步的分析和处理,以提取更有价值的信息。

        基于Java的AOI数据解析与转换的实现方法,不仅能够为用户提供一个高效、灵活、可靠的解决方案,还能够促进AOI数据在各个领域的应用和发展。通过该方法,用户可以更加方便地获取和转换AOI数据,从而更好地满足自身的需求,推动相关领域的研究和进步。未来,随着技术的不断发展和需求的不断变化,该方法也将不断完善和优化,为地理信息数据处理领域的发展做出更大的贡献。

一、AOI数据结构简介

        作为AOI数据的来源,本节将重点对AOI的数据结构进行深入的介绍。受文章当时的调用API接口的限制,文章介绍的数据以当时的百度API接口为准,如当前您参考的对应接口有所变化,请参考对应的API接口。为了让大家对地图厂商提供的AOI数据有一个简单的认识,这里以百度地图为例,将对百度地图中的AOI数据及其结构进行简单的讲解。

1、官网的实例接口

        首先我们打开地图的官网地址,在打开的地图检索栏中输入待查询的地方。首先我们以一个小区为例,如“璞丽景园”,点击查询按钮后,打开如下界面:

        在地图中我们可以很明显的看到,不仅在左边的检索结果展示窗口中列出了目标小区的地址信息:"湖南省长沙市岳麓区映日路与看云路111号", 于此同时,在地图中也会同步将小区的矢量范围进行展示,是一个常见的polygon面。请大家注意,这里的Polygon面就是本文的主角,AOI(兴趣面数据)。以上是以一个城市居民小区为例介绍了如何进行数据检索以及数据可视化。为了区分不同的数据类型,下面我们选取附近的“岳麓山国家重点风景名胜区”,输入关键字后,点击详细即可看到景区的基本信息以及AOI数据,

        与之前的城市小区信息一样,在界面中不仅展示出地点的信息,同时还在地图上展示了空间边界信息。到此,请注意,我们将实力功能和界面进行简要的介绍。

2、响应参数介绍

        在了解了地址信息如何查询之后,接下来结合API的响应接口,具体来看一下获取的详情接口的属性字段信息,为后续的数据解析和空间挖掘打下坚实的基础,因此本小节将从响应参数的介绍为切入点,逐一向大家解析。在地图的数据返回接口中,以下的接口是返回目标地址的包含AOI数据的响应信息。

        上面的给出的图谱展示的只是一个粗略的结构,真实的信息比上面给出的更多更丰富。大家可以在百度地图上体验相关查询接口,并查阅具体接口的响应参数。简单来讲,详情JSON 数据中,contentavocadoresult 是三个不同的属性,它们各自代表不同的信息:

content 属性

  • 代表内容信息:这个属性包含了与景点相关的各种详细内容信息。它可能包括景点的介绍、特色、历史背景、游客评价等。这些信息有助于用户了解景点的各个方面,为游客提供决策参考。例如,它可能会描述景点的自然风光、文化价值、游客体验等。

avocado 属性

  • 代表卡片信息:这个属性包含了与景点相关的卡片信息。卡片通常用于展示特定类型的内容或功能模块,如图片墙、电话号码、导航信息等。这些卡片可以为用户提供快速访问特定功能或信息的途径,增强用户体验。例如,它可能会包含一个图片墙卡片,展示景点的精美图片;或者一个电话卡片,提供景点的联系电话。

result 属性

  • 代表结果信息:这个属性包含了与请求结果相关的信息。它通常用于表示请求的处理结果,如授权信息、状态码等。这些信息对于开发者或系统来说很重要,因为它们可以用来判断请求是否成功,以及如何处理后续的逻辑。例如,它可能会包含一个授权令牌,表示用户有权限访问某些数据或功能。

        这三个属性在 JSON 数据中各自承担着不同的角色,共同构成了对景点信息的全面描述。使用notepad的json格式化查询器可以看到如下结构:

        返回的信息参数非常多,但是这里主要讲解空间信息,所以主要看ext/detail_info/guoke_geo/geo字段就是我们需要的AOI空间范围数据,如下图中红色框中的内容,是一串非常长的字符串。请记住这个属性,在后面的解析和转换中会继续用得到。

        以上就是对相关AOI的查询接口以及数据属性的详细介绍,下面我们使用Java语言对获取到的AOI数据进行解析和转换。 

二、Java对AOI数据的解析

        在了解了AOI的查询接口以及返回参数的属性信息之后,本节我们将使用JAVA语言对获取到的AOI数据进行解析。首先介绍数据解析的具体流程,然后介绍具体的解析实现,最后将解析得到的结果转换成GeoJSON,然后在Qgis软件中进行预览,验证我们的结果。

1、数据解析流程图

        为了实现对获取的AOI数据进行解析,首先将获取的面边界信息进行内存加载,然后调用转换逻辑,将坐标值进行拼接解析,然后解析得到的坐标。此时的坐标是墨卡托坐标,类似于12571261.302597,3250490.205730这种的值,然后需要调用墨卡托坐标转经纬度坐标方法将值进行转换,然后将得到的百度经纬度坐标转为WGS84坐标,此时就得到对应的WGS84坐标,然后根据转换的坐标值,调用GeoTools的polygon创建方法构建一个面,然后调用FeatureJSON来得到JSON构建对象,最后生成GeoJSON数据后,在Qgis等客户端工具中进行查看。

2、数据解析实现

        首先来分享一段解析得到的AOI矢量边界信息,如下:

        在进行正式的坐标解析时,需要去掉一些信息,这里我们将-1之前的字符进行过滤掉,后面的才是我们需要的空间矢量数据。

4|12566456.116665,3253264.180375;12566801.580670,3253687.136888|1-12566456.1166646,3253456.6396633,12566457.4438543,3253451.9993111,12566457.8641464,3253450.5485102

        最后我们调用公共的方法来实现墨卡托坐标转bd的经纬度坐标。其中解析的方法如下:

/**
* -解析Jeo数据
* @param mocator
*/
public static List<String> parseJeo(String mocator) {List<String> mocatorList = new ArrayList<String>();if (null == mocator)return null;/* 拆分数据 */String[] geos = mocator.split("\\|");int n = Integer.parseInt(geos[0]);String center = geos[1];String polylineMoca = geos[2]; // 墨卡托坐标String[] plm = polylineMoca.split("\\;");/* 获取墨卡托边界 */String geo = null;if (n == 4) {for (int i = 0; i < plm.length; i++) {String[] geoPaths = plm[i].split("\\-");if (geoPaths[0].equals("1")) {geo = geoPaths[1];}}}// 墨卡托坐标解析String[] geoPolyline = geo.split("\\,");for (int i = 0; i < geoPolyline.length; i += 2) {mocatorList.add(geoPolyline[i] + "#" + geoPolyline[i + 1]);}return mocatorList;
}

        墨卡托坐标转经纬度坐标的方法如下:

/**
* -墨卡托坐标转经纬度坐标
* @param x
* @param y
* @return
*/
public static Map<String, Double> convertMC2LL(Double x, Double y) {Double[] cF = null;x = Math.abs(x);y = Math.abs(y);for (int cE = 0; cE < MCBAND.length; cE++) {if (y >= MCBAND[cE]) {cF = MC2LL[cE];break;}}Map<String, Double> location = converter(x, y, cF);location.put("lng", location.get("x"));location.remove("x");location.put("lat", location.get("y"));location.remove("y");return location;
}

         最后,我们基于GeoTools将上面转换的经纬度坐标值转换成geometry并最终转换成GeoJSON数据,并可以在gis软件上进行展示和渲染。转换和生成GeoJSON的具体方法如下:

public static void main(String[] args) {String objId = "3cf5bd92df7340f1f7eafc6e"; String path = "E:/baidu_aio/" + objId + ".txt";try {System.out.println(path);String geoStr = new String(Files.readAllBytes(Paths.get(path)), "UTF-8");List<String> mocatorList = parseJeo(geoStr);StringBuilder sb = new StringBuilder(1024);// 获取GeometryFactory实例GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(null);Coordinate[] coords = {};if(mocatorList != null && mocatorList.size() > 0) {coords = new Coordinate[mocatorList.size()];}for (int i = 0; i < mocatorList.size(); i++) {String[] coordinate = mocatorList.get(i).split("\\#");Map<String, Double> location = convertMC2LL(Double.parseDouble(coordinate[0]),Double.parseDouble(coordinate[1]));Double lng = location.get("lng");Double lat = location.get("lat");String coord = lng + "," + lat;sb.append(coord);if (i < mocatorList.size() - 1) {sb.append(";");}double[] tempBd284 = CoordinateTransformUtil.bd09towgs84(lng, lat);coords[i] = new Coordinate(tempBd284[0], tempBd284[1]);}// 使用坐标点创建线性环(LinearRing),这是多边形的第一个也是唯一一个环LinearRing shell = geometryFactory.createLinearRing(coords);Polygon polygon = geometryFactory.createPolygon(shell, null);// 创建SimpleFeatureTypeSimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder();builder.setName("PolygonFeature");builder.setCRS(DefaultGeographicCRS.WGS84);builder.add("geometry", Polygon.class);SimpleFeatureType featureType = builder.buildFeatureType();// 创建SimpleFeatureSimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(featureType);//指定唯一的IDSimpleFeature feature = featureBuilder.buildFeature(null, new Object[]{polygon});// 创建FeatureJSON对象,用于将几何对象转换为GeoJSONFeatureJSON featureJSON = new FeatureJSON();// 将SimpleFeature对象转换为GeoJSON字符串StringWriter writer = new StringWriter();featureJSON.writeFeature(feature, writer);String geoJSON = writer.toString();System.out.println(geoJSON);} catch (IOException e) {e.printStackTrace();}
}

        这样我们就实现了对AOI数据进行解析,同时实现将墨卡托坐标转为经纬度坐标。同时调用GeoTools来生成polygon并生成了对应的GeoJSON数据。下面就可以来看一下成果,看一下GeoJSON加载的效果。 

3、AOI数据解析成果

        在经过以上的数据解析之后,在IDE的运行调试界面运行上面的程序,可以得到以下的GeoJSON数据,结果如下所示:

        然后在磁盘中新建一个geojson文件,将上图红框中的geojson数据复制到对应的geojson文件中,如下图所示,这样就实现了geojson数据的生成:

         最后将得到的geojson数据叠加到地图中,就可以看到其位置是否准确。

        可以看到,将geojson数据与底图进行融合后,成功的在遥感影像中进行了展示,统一空间位置贴合准确,位置没有偏移,说明转换结果良好,符合我们的预期。 

三、总结

        以上就是本文的主要内容,本文将重点介绍基于Java的百度AOI数据解析与转换的实现方法。基于Java的AOI数据解析与转换的实现方法,不仅能够为用户提供一个高效、灵活、可靠的解决方案,还能够促进AOI数据在各个领域的应用和发展。通过该方法,用户可以更加方便地获取和转换AOI数据,从而更好地满足自身的需求,推动相关领域的研究和进步。未来,随着技术的不断发展和需求的不断变化,该方法也将不断完善和优化,为地理信息数据处理领域的发展做出更大的贡献。行文仓促,难免有许多不足之处,如有不足,在此恳请各位专家博主在评论区或者私信指出,不胜感激。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】构造函数与析构函数

写在前面 构造函数与析构函数都是属于类的默认成员函数&#xff01; 默认成员函数是程序猿不显示声明定义&#xff0c;编译器会中生成。 构造函数和析构函数的知识需要建立在有初步类与对象的基础之上的&#xff0c;关于类与对象不才在前面笔记中有详细的介绍&#xff1a;点我…

2013年IMO几何预选题第4题

在 △ A B C \triangle ABC △ABC 中, A B < A C AB < AC AB<AC. P P P, Q Q Q 是直线 A C AC AC 上的两个不同的点, 满足 ∠ P B A ∠ Q B A ∠ A C B \angle PBA \angle QBA \angle ACB ∠PBA∠QBA∠ACB, 且 A A A 在 P P P 与 C C C 之间. 已知在线段…

UDP报文格式

UDP是传输层的一个重要协议&#xff0c;他的特性有面向数据报、无连接、不可靠传输、全双工。 下面是UDP报文格式&#xff1a; 1&#xff0c;报头 UDP的报头长度位8个字节&#xff0c;包含源端口、目的端口、长度和校验和&#xff0c;其中每个属性均为两个字节。报头格式为二…

网络科技有限公司网络设计

网络科技有限公司网络设计 摘要&#xff1a;伴随着信息科技发展&#xff0c;上网变得一件必不可少的事情&#xff0c;当然网络安全对我们也是越来越重要。像我们的传统网结构是无法为我们的上网提供一个安全的网络环境。锐雯网络科技有限公司就是以网络安全为基本的对网络惊醒…

【c++】哈希

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 目录 1. unordered系列关联式容器1.1 unordered_map1.2 接口函数 例题 2.哈希概念2.1哈希冲突2.2哈希函数2.3哈希冲突解决2.3.1线性探测二次探测 2.3.2开散列 3. 封装迭代器封装完整代码&a…

@Query(org.springframework.data.jpa.repository.Query)

文章目录 1. findPAProductByAdminId 方法作用&#xff1a;解释&#xff1a; 2. findPaginatedPAProductByAdminId 方法作用&#xff1a;解释&#xff1a; 总结&#xff1a; package com.productQualification.resource.repository.productAuthentication;import com.productQu…

[Collection与数据结构] PriorityQueue与堆

1. 优先级队列 1.1 概念 前面介绍过队列&#xff0c;队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队列时&#xff0c;可能需要优先级高的元素先出队列&#xff0c;该中场景下&#xff0c;使用队列显然…

STM32网络通讯之CubeMX实现LWIP项目设计(十五)

STM32F407 系列文章 - ETH-LWIP-CubeMX&#xff08;十五&#xff09; 目录 前言 一、软件设计 二、CubeMX实现 1.配置前准备 2.CubeMX配置 1.ETH模块配置 2.时钟模块配置 3.中断模块配置 4.RCC及SYS配置 5.LWIP模块配置 3.生成代码 1.main文件 2.用户层源文件 3.…

【React】静态组件动态组件

目录 静态组件动态组件创建一个构造函数(类)使用 class 实现组件**使用 function 实现类组件** 静态组件 函数组件是静态组件&#xff1a; 组件第一次渲染完毕后&#xff0c;无法基于内部的某些操作让组件更新「无法实现自更新」&#xff1b;但是&#xff0c;如果调用它的父组…

我的世界-与门、或门、非门等基本门电路实现

一、红石比较器 (1) 红石比较器结构 红石比较器有前端单火把、后端双火把以及两个侧端 其中后端和侧端是输入信号,前端是输出信号 (2) 红石比较器的两种模式 比较模式 前端火把未点亮时处于比较模式 侧端>后端 → 0 当任一侧端强度大于后端强度时,输出…

持续集成 01|Gitee介绍、Pycharm使用Gitee

目录 一、理论 二、 git的简介与安装 三、Gitee 1、注册网易163邮箱 2、注册Gitee账号 3、git和gitee管理代码工作原理 三、PyCharm安装配置Gitee 四、Pycharm使用Gitee插件的五种场景 1、将 Gitee的新仓库 Checkout&#xff08;检出&#xff09;到 Pycharm中 2、推送…

【Qt】03-页面切换

前言一、按键实现界面切换1.1 创建新的类文件1.1.1 创建1.1.2 细节选择 1.2 代码以及需要注意的点mywidget.cppsecondwidget.cppmywidget.hsecondwidget.h 1.3 结果展示 二、signal关键字2.1 代码以及解释mywidget.cppsecondwidget.cppmywidget.hsecondwidget.h解释 2.2 现象 三…

软件授权管理中的软件激活向导示例

软件激活向导示例 在软件许可中&#xff0c;提供许可应该是简单和安全的。这适用于想要在中央许可证服务器上创建新许可证的软件开发人员&#xff0c;也适用于需要在其设备上获得许可证的最终用户。如果所讨论的系统有互联网连接&#xff0c;或是暂时的连接&#xff0c;就可以…

02JavaWeb——JavaScript-Vue(项目实战)

一、JavaScript html完成了架子&#xff0c;css做了美化&#xff0c;但是网页是死的&#xff0c;我们需要给他注入灵魂&#xff0c;所以接下来我们需要学习 JavaScript&#xff0c;这门语言会让我们的页面能够和用户进行交互。 1.1 介绍 通过JS/js效果演示提供资料进行效果演…

【java】java入门

盘符名称冒号---------盘符切换 dir---------------查看当前路径下的内容 cd目录--------进入单级目录 cd..----------回退到上一级目录 cd \----------回退到盘符目录 cls----------清屏 exit 为什么要配环境变量&#xff1f; 在任意的目录下都可以打开指定的软件。把软件的路…

利用爬虫获取某学习软件的考试题库(带源码)

首先要重新进行账号的登陆用来获取cookie 按下F12在控制台输入&#xff1a; // 获取当前页面的 cookies var cookies document.cookie.split(";");// 创建一个数组来存储 cookies 对象 var cookieArray [];// 遍历每个 cookie 并将其转换为对象 cookies.forEach(f…

【C++篇】红黑树的实现

目录 前言&#xff1a; 一&#xff0c;红黑树的概念 1.1&#xff0c;红黑树的规则 1.2&#xff0c;红黑树的最长路径 1.3&#xff0c;红黑树的效率分析 二&#xff0c;红黑树的实现 2.1&#xff0c;红黑树的结构 2.2&#xff0c;红黑树的插入 2.2.1&#xff0c;大致过程…

Autodl转发端口,在本地机器上运行Autodl服务器中的ipynb文件

通过 SSH 隧道将远程端口转发到本地机器 输入服务器示例的SSH指令和密码&#xff0c;将远程的6006端口代理到本地 在服务器终端&#xff0c;激活conda虚拟环境 conda activate posecnnexport PYOPENGL_PLATFORMegljupyter notebook --no-browser --port6006 --allow-root从…

镭速大文件传输视频文件预览实现原理

镭速可以支持视频预览&#xff0c;在测试过程中需要大量不同格式的视频&#xff0c;如果直接去找各种格式的视频不太现实&#xff0c;所以就会用到一个视频格式转换的工具ffmpeg&#xff0c;本文将介绍ffmpeg的基本使用方法。FFmpeg 是一个免费开源的音视频处理工具&#xff0c…

达梦8-DMSQL程序设计学习笔记1-DMSQL程序简介

1、DMSQL程序简介 DMSQL程序是达梦数据库对标准SQL语言的扩展&#xff0c;是一种过程化SQL语言。在DMSQL程序中&#xff0c;包括一整套数据类型、条件结构、循环结构和异常处理结构等&#xff0c;DMSQL程序中可以执行SQL语句&#xff0c;SQL语句中也可以使用DMSQL函数。 DMSQ…