java解析本地.geoJson地理信息,根据经纬度找到所在区域(全程Chatgpt3.5交互写代码,附gpt交流记录)

这篇具有很好参考价值的文章主要介绍了java解析本地.geoJson地理信息,根据经纬度找到所在区域(全程Chatgpt3.5交互写代码,附gpt交流记录)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1:起因

对于一些因为安全等级而不连通外网的服务器,客户提出了根据本地.geoJson文件获取区域地理信息,根据用户提供的经纬度x,y坐标,找到这个点所在的区域

2:思路

根据.geoJson文件中连续的点连线,画框构建多边形,再判断这个点再哪个多边形内

3:.geoJson文件简单了解

以下是chatgpt3.5给出的解释:

java根据经纬度获取所在区域,gpt,java

java根据经纬度获取所在区域,gpt,java

注意:根据我的理解,此处gpt还漏掉了一种类型MultiPolygon,MultiPolygon表示的是多个多边形,而Polygon表示的是单个多边形:

java根据经纬度获取所在区域,gpt,java

 java根据经纬度获取所在区域,gpt,java

 

4:下载测试.geoJson文件

先准备一下测试数据:

免费下载实时更新的geoJson数据、行政区划边界数据、区划边界坐标集合__HashTang (hxkj.vip)https://geojson.hxkj.vip/打开上述连接,选择广东省,下载文件,我这里下载的文件名为440000.geoJson,路径直接放在D盘

java根据经纬度获取所在区域,gpt,java

5:向Chatgpt提需求

方便复制,不截图了,以下是我的提问:

1:解析.geoJson文件

我:从.geoJson文件中提取Polygon和MultiPolygon类型的coordinates经纬度数据,使用这些数据构建Coordinate多边形对象,存在一个map中,其中map的key为,geoJson文件中properties下的code,value为Coordinate对象

2:构建多边形并查找

再写一个函数,传入x,y经纬度坐标构建一个点,可以从上面构建的map中找到其中这个点所在的多边形

6:代码(正片开始)

gpt直接生成的代码还是有点问题的,具体的调教过程可以看最后的聊天记录连接,这里直接附上我修改后可以直接运行的代码:

先引入依赖

        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-main</artifactId>
            <version>25.0</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-shapefile</artifactId>
            <version>25.0</version>
        </dependency>

        <dependency>
            <groupId>org.locationtech.jts</groupId>
            <artifactId>jts-core</artifactId>
            <version>1.16.1</version>
        </dependency>

下载这几个依赖需要添加他们家的仓库

    <repositories>
        <repository>
            <id>osgeo</id>
            <name>OSGeo Release Repository</name>
            <url>https://repo.osgeo.org/repository/release/</url>
            <snapshots><enabled>false</enabled></snapshots>
            <releases><enabled>true</enabled></releases>
        </repository>
    </repositories>
package com.gdunicom.cloud.system.geo;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.locationtech.jts.algorithm.PointLocator;
import org.locationtech.jts.geom.*;

import java.io.File;
import java.io.IOException;
import java.util.*;

public class GeoJSONParser {

    // 创建Map用于存储Coordinate多边形对象
    static Map<String, Coordinate[]> polygonsMap = new HashMap<>();


    public static void main(String[] args) {
        // 创建ObjectMapper对象
        ObjectMapper objectMapper = new ObjectMapper();

        try {
            // 读取.geojson文件并解析为JsonNode对象
            File file = new File("D:\\440000.geoJson");
            JsonNode rootNode = objectMapper.readTree(file);

            // 获取FeatureCollection下的features数组
            JsonNode featuresNode = rootNode.get("features");

            // 遍历features数组
            for (JsonNode featureNode : featuresNode) {
                // 获取geometry字段
                JsonNode geometryNode = featureNode.get("geometry");

                // 获取类型字段
                String type = geometryNode.get("type").asText();

                // 获取坐标字段
                JsonNode coordinatesNode = geometryNode.get("coordinates");

                // 获取properties字段
                JsonNode propertiesNode = featureNode.get("properties");

                // 获取code字段
                String code = propertiesNode.get("adcode").asText();

                // 根据类型进行相应处理
                if (type.equals("Polygon")) {
                    // 处理Polygon类型
                    Coordinate[] coordinates = parseCoordinates(coordinatesNode);
                    polygonsMap.put(code, coordinates);
                } else if (type.equals("MultiPolygon")) {
                    // 处理MultiPolygon类型
                    for (JsonNode polygonNode : coordinatesNode) {
                        Coordinate[] coordinates = parseCoordinates(polygonNode);
                        polygonsMap.put(code, coordinates);
                    }
                }
            }

//            // 输出结果
//            for (Map.Entry<String, Coordinate[]> entry : polygonsMap.entrySet()) {
//                String code = entry.getKey();
//                Coordinate[] coordinates = entry.getValue();
//                System.out.println("Code: " + code);
//                for (Coordinate coordinate : coordinates) {
//                    System.out.println("Coordinate: " + coordinate.getX() + ", " + coordinate.getY());
//                }
//                System.out.println();
//            }
            System.out.println("size:"+polygonsMap.size());
            
            //我的位置,我在广州
            double longitude = 113.374172; // 经度
            double latitude = 23.064884;  // 纬度

            String containingPolygon = findContainingPolygon(longitude, latitude);
            System.out.println("Containing Polygon: " + containingPolygon);


        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static Coordinate[] parseCoordinates(JsonNode coordinatesNode) {
        if (!coordinatesNode.isArray()) {
            return null; // 非法的 JSON 数组
        }

        List<Coordinate> coordinateList = new ArrayList<>();
        Iterator<JsonNode> iterator = coordinatesNode.elements();
        while (iterator.hasNext()) {
            JsonNode coordinateNode = iterator.next();
            if (coordinateNode.isArray() && coordinateNode.size() == 2) {
                double x = coordinateNode.get(0).asDouble();
                double y = coordinateNode.get(1).asDouble();
                Coordinate coordinate = new Coordinate(x, y);
                coordinateList.add(coordinate);
            }else if(coordinateNode.isArray() && coordinateNode.size() > 2){
                Iterator<JsonNode> elements = coordinateNode.elements();
                while (elements.hasNext()) {
                    JsonNode next = elements.next();
                    if (next.isArray() && next.size() == 2) {
                        double x = next.get(0).asDouble();
                        double y = next.get(1).asDouble();
                        Coordinate coordinate = new Coordinate(x, y);
                        coordinateList.add(coordinate);
                    }
                }
            } else {
                return null; // 非法的坐标格式
            }
        }

        return coordinateList.toArray(new Coordinate[0]);
    }

    public static String findContainingPolygon(double longitude, double latitude) {
        // 创建GeometryFactory
        GeometryFactory geometryFactory = new GeometryFactory();

        // 创建点坐标
        Coordinate pointCoordinate = new Coordinate(longitude, latitude);

        // 遍历多边形Map,查找包含点的多边形
        for (Map.Entry<String, Coordinate[]> entry : polygonsMap.entrySet()) {
            String code = entry.getKey();
            Coordinate[] coordinates = entry.getValue();

            // 创建MultiPolygon对象
            MultiPolygon multiPolygon = geometryFactory.createMultiPolygon(new Polygon[] {
                    geometryFactory.createPolygon(coordinates)
            });

            // 使用PointLocator检查点是否在多边形内
            PointLocator pointLocator = new PointLocator();
            int location = pointLocator.locate(pointCoordinate, multiPolygon);

            if (location != Location.EXTERIOR) {
                return code;
            }
        }

        return null; // 未找到包含点的多边形
    }
}

6:验证 

我当前在广州,看看我的坐标 23.064884,113.374172

java根据经纬度获取所在区域,gpt,java

运行结果:

java根据经纬度获取所在区域,gpt,java

size为这个这个map的大小,刚好对应广东省21个市,返回值为区域代码440100,查找一下源文件中的信息,就是广州市,完结撒花java根据经纬度获取所在区域,gpt,java

 7:聊天记录

最后附上交流记录(需要魔法):

 https://chat.openai.com/share/e57817bf-ae6b-45e9-8074-25b7cd52b2d4文章来源地址https://www.toymoban.com/news/detail-741161.html

到了这里,关于java解析本地.geoJson地理信息,根据经纬度找到所在区域(全程Chatgpt3.5交互写代码,附gpt交流记录)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elasticsearch 处理地理信息

    ​ GeoHash是一种地理坐标编码系统,可以将地理位置按照一定的规则转换为字符串,以方便对地理位置信息建立空间索引。首先要明确的是,GeoHash代表的不是一个点而是一个区域。GeoHash具有两个显著的特点:一是通过改变 GeoHash的长度,我们可以表示任意精度的位置:GeoHas

    2024年02月12日
    浏览(37)
  • 地理信息系统概率笔记1

    P1 地理信息系统概论 信息:用文本、数字、符号、语言、图像来传播; 地理信息:是表征地理系统诸要素的数量、质量、分布特征、相互联系和变化规律的数字、文字、图像和图形等的总称; 山川河流、城市楼栋、公路桥梁都是地理信息; 需要对特征就行抽象,用点、线、

    2024年02月09日
    浏览(44)
  • 地理信息系统概论复习重点

    地理信息系统概论重点 1 、数据:是通过数字化并记录下来可以被识别的符号,用以定性或定量地描述事物的特征和状况。 2 、信息:是指主体与外部客体之间相互联系的一种形式,是主体和客体之间的一切有用的消息或知识,是表征事物特征的一种普遍形式。 3 、数据与信

    2024年02月10日
    浏览(38)
  • 地理信息安全在线培训考试-判断题

    1、机关、单位可以将依法应当公开的事项确定为国家秘密,不得将涉及国家秘密的信息公开。 A:对 B:不对 2、国家保密行政管理部门主管全国的保密工作。县级以上地方各级保密行政管理部门主管本行政区域的保密工作。 A:对 B:不对 3、国家秘密的保密期限,除另有规定

    2024年02月05日
    浏览(112)
  • 地理信息系统原理-空间数据结构(7)

    ​四叉树编码 1.四叉树编码定义 四叉树数据结构是一种对栅格数据的压缩编码方法,其基本思想是将一幅栅格数据层或图像等分为四部分,逐块检查其格网属性值(或灰度);如果某个子区的所有格网值都具有相同的值,则这个子区就不再分割,否则还要把这个子区再分割成

    2024年02月06日
    浏览(56)
  • 通过ip获取地理位置信息

    GeoLite2-City.mmdb 文件是 MaxMind 公司提供的一个免费的 IP 地址与城市地理位置映射数据库文件。它包含了 IP 地址范围与对应的城市、地区、国家、经纬度等地理位置信息的映射。这种数据库文件可以用于识别访问您的应用程序或网站的用户的地理位置,从而实现针对不同地区的

    2024年02月12日
    浏览(44)
  • Unity 获取手机地理位置信息

    在游戏的开发过程中,有时候会遇到需要获取玩家位置信息的需求,比如显示玩家所在的国家城市等。 有一下方法可以参考: 可以根据手机的地区和语言来做判断。 根据IP来判断所处的位置,阿里云啥的都有对应的接口服务。 根据GPS来判断。 以上方法都各有利弊吧,这里简

    2024年02月12日
    浏览(46)
  • Redis GEO地理位置信息的应用

    Redis的GEO操作是一种基于地理位置信息进行操作的功能。它使用经度和纬度坐标来表示地理位置,支持存储地理位置信息用来实现诸如附近位置、摇一摇这类依赖于地理位置信息的功能。 1.GEOADD添加位置信息 将一个或多个指定的地理位置(经度、纬度、名称)添加到指定的键

    2024年02月08日
    浏览(48)
  • 探索未知世界:桌面端3D GIS引领地理信息新时代

    近年来, 桌面端的三维地理信息系统(3D GIS) 在地理信息领域迎来了显著的发展,为我们带来了更深入、更丰富的地理空间认知和数据分析体验。从城市规划到环境保护,从资源管理到应急响应,桌面端的3D GIS正逐渐成为解决复杂地理问题的有力工具。 深度还原地理空间:

    2024年02月11日
    浏览(49)
  • uniapp h5获取用户地理位置信息(高德地图)

     使用uni.getLocation()先获取到当前位置信息的经纬度 H5端测试可以使用http,上线打包需要设置为https模式 谷歌浏览器可能会获取不到任何信息,因为谷歌浏览器位置信息是连接谷歌服务器获取的,国内用户可能获取位置信息失败 使用高德开发平台注册一个key 高德开发平台:高

    2024年02月13日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包