基于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.mzph.cn/pingmian/67326.shtml

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

相关文章

【WEB】网络传输中的信息安全 - 加密、签名、数字证书与HTTPS

文章目录 1. 概述2. 网络传输安全2.1.什么是中间人攻击2.2. 加密和签名2.2.1.加密算法2.2.2.摘要2.2.3.签名 2.3.数字证书2.3.1.证书的使用2.3.2.根证书2.3.3.证书链 2.4.HTTPS 1. 概述 本篇主要是讲解讲一些安全相关的基本知识&#xff08;如加密、签名、证书等&#xff09;&…

shell练习2

需求&#xff1a;判断192.168.1.0/24网络中&#xff0c;当前在线的ip有哪些&#xff0c;并编写脚本打印出来。 #!/bin/bashnmap -sn 192.168.1.0/24 | grep Nmap scan report for | awk {print $5} 注意&#xff1a;当运行 bash ip.sh 时出现 nmap: command not found 的错误…

【运维自动化-作业平台】魔法变量到底如何使用之主机列表类型

蓝鲸作业平台&#xff0c;以下简称作业平台或JOB平台 魔法变量&#xff1a;JOB平台执行引擎提供的特有的变量能力用法 脚本中使用&#xff0c;并且需要事先声明&#xff1a;job_import {{变量名}} 声明后&#xff0c;同样是使用 dollar 符 大括号&#xff1a;${变量名}来取值…

活动预告 | CCF开源发展委员会开源供应链安全技术研讨会(2025第一期)——“大模型时代的开源供应链安全风控技术”...

点击蓝字 关注我们 CCF Opensource Development Committee CCF开源发展委员会开源供应链安全工作组&#xff08;以下简称CCF-ODC-OSS&#xff09;将于1月17日下午在北京黄大年茶思屋举行2025年第一期开源供应链安全技术研讨会&#xff0c;此次研讨会主题为“大模型时代的开源供…

XML序列化和反序列化的学习

1、基本介绍 在工作中&#xff0c;经常为了调通上游接口&#xff0c;从而对请求第三方的参数进行XML序列化&#xff0c;这里常使用的方式就是使用JAVA扩展包中的相关注解和类来实现xml的序列化和反序列化。 2、自定义工具类 import javax.xml.bind.JAXBContext; import javax.x…

基于php求职招聘系统设计

基于php求职招聘系统设计 摘要 随着社会信息化时代的到来&#xff0c;如今人们社会的生活节奏普遍加快&#xff0c;人们对于工作效率的要求也越来越高&#xff0c;企业 举办招聘会耗时耗财&#xff0c;个人参加招聘会漫无目的寻找不到“方向”&#xff0c;网络搜索工作量目的…

SDK调用文心一言如何接入,文心一言API接入教程

一、前期准备 注册百度智能云账号&#xff1a; 前往百度智能云官网注册一个账号。这是接入文心一言API的基础。 了解API接口&#xff1a; 在百度智能云开放平台中&#xff0c;找到文心一言API的详情页&#xff0c;了解提供的API接口类型&#xff08;如云端API、移动端API、离线…

【机器学习】数据拟合-最小二乘法(Least Squares Method)

最小二乘法&#xff08;Least Squares Method&#xff09; 最小二乘法是一种广泛使用的数据拟合方法&#xff0c;用于在统计学和数学中找到最佳拟合曲线或模型&#xff0c;使得观测数据点与模型预测值之间的误差平方和最小化。以下是详细介绍&#xff1a; 基本概念 假设有一组…

Flutter 多终端测试 自定义启动画面​​​​​​​ 更换小图标和应用名称

多终端测试 flutter devices flutter run -d emulator-5554 flutter run -d emulator-5556 自定义启动画面 之前&#xff1a; 进入assert 3x 生成 1x 2x dart run flutter_native_splash:create dart run flutter_native_splash:remove 现在&#xff08;flutter_nativ…

springMVC实现文件上传

目录 一、创建项目 二、引入依赖 三、web.xml 四、编写上传文件的jsp页面 五、spring-mvc.xml 六、controller 七、运行 一、创建项目 二、引入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.o…

Java内存与缓存

Java内存管理和缓存机制是构建高性能应用程序的关键要素。它们之间既有联系又有区别&#xff0c;理解这两者对于优化Java应用至关重要。 Java 内存模型 Java内存模型&#xff08;JMM&#xff09;定义了线程如何以及何时可以看到其他线程修改过的共享变量的值&#xff0c;并且规…

图片和短信验证码(头条项目-06)

1 图形验证码接口设计 将后端⽣成的图⽚验证码存储在redis数据库2号库。 结构&#xff1a; {img_uuid:0594} 1.1 创建验证码⼦应⽤ $ cd apps $ python ../../manage.py startapp verifications # 注册新应⽤ INSTALLED_APPS [django.contrib.admin,django.contrib.auth,…

云服务信息安全管理体系认证,守护云端安全

在数据驱动的时代&#xff0c;云计算已成为企业业务的超级引擎&#xff0c;推动着企业飞速发展。然而&#xff0c;随着云计算的广泛应用&#xff0c;信息安全问题也日益凸显&#xff0c;如同暗流涌动下的礁石&#xff0c;时刻威胁着企业的航行安全。这时&#xff0c;云服务信息…

LabVIEW与WPS文件格式的兼容性

LabVIEW 本身并不原生支持将文件直接保存为 WPS 格式&#xff08;如 WPS 文档或表格&#xff09;。然而&#xff0c;可以通过几种间接的方式实现这一目标&#xff0c;确保您能将 LabVIEW 中的数据或报告转换为 WPS 可兼容的格式。以下是几种常见的解决方案&#xff1a; ​ 导出…

创建 WordPress 插件(第一部分):添加管理页面

WordPress 是互联网上最受欢迎的内容管理系统之一。它是用 PHP 创建的&#xff0c;可以处理从博客到商业网站的一切需求。事实上&#xff0c;我们的博客和网站都使用 WordPress。在本文中&#xff0c;我将向你展示如何创建一个 WordPress 插件&#xff0c;该插件会在管理员控制…

解锁企业数据管理统一身份认证难题,EasyMR助力企业敏捷提效

在数字经济迅猛发展的当下&#xff0c;企业数据量正以令人惊叹的速度持续增长。据IDC研究显示&#xff0c;至2025年&#xff0c;全球数据总量预计将超175 ZB。数据的爆发式增长对企业而言&#xff0c;既是机遇&#xff0c;更是巨大挑战。 如今&#xff0c;大数据已然成为企业决…

OPT: Open Pre-trained Transformer语言模型

摘要 大规模语言模型通常需要数十万计算日的训练时间&#xff0c;展现了在零样本和小样本学习中的显著能力。鉴于其计算成本之高&#xff0c;这些模型在没有大量资本投入的情况下难以复现。对于那些通过API提供的少数模型&#xff0c;研究者无法获取完整的模型权重&#xff0c…

Qt应用之MDI(多文档设计)

qt creator 版本6.8.0 MinGW 64bit 由此模块可以扩展成设计一个qt文本编辑器。 界面如下 部分功能展示如下 新建文件 打开文件 mdi模式、级联模式和平铺模式 界面和程序构建过程。 1.如图所需.cpp和.h文件 2.mainwindow.ui和tformdoc.ui界面布局如下 不懂什么是Action如何…

Linux第二课:LinuxC高级 学习记录day04

6、shell中的语句 6.3、结构性语句 6.3.1、if if…then…fi 1、结构 1&#xff09;基本结构 if 表达式 then 命令表 fi if [ 表达式 ] // 【】两侧有空格 then 命令表 fi 2&#xff09;分层结构 if 表达式 then 命令表1 else 命令表2 fi 3&#xff09;嵌套结构 if …

Linux C 使用ZBar库解析二维码和条形码

1. 编译zbar库 下载 zbar 库源码&#xff0c;这里需要注意下&#xff0c;如果识别的二维码中有中文的话&#xff0c;会出现乱码&#xff0c;一般二维码里中文为UTF-8编码&#xff0c;zbar会默认给你把UTF-8转换为ISO8859-1。有两种解决办法&#xff0c;一是自己再转换一下编码…