我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

1:起因

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

2:思路

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

3:.geoJson文件简单了解

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

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

 

 

4:下载测试.geoJson文件

先准备一下测试数据:

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

5:向Chatgpt提需求

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

1:解析.geoJson文件

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

2:构建多边形并查找

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

6:代码(正片开始)

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

先引入依赖

                    org.geotools            gt-main            25.0                            org.geotools            gt-shapefile            25.0                            org.locationtech.jts            jts-core            1.16.1        

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

                        osgeo            OSGeo Release Repository            https://repo.osgeo.org/repository/release/            false            true            
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 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 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 coordinateList = new ArrayList<>();        Iterator 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 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 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

运行结果:

size为这个这个map的大小,刚好对应广东省21个市,返回值为区域代码440100,查找一下源文件中的信息,就是广州市,完结撒花

 7:聊天记录

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

 https://chat.openai.com/share/e57817bf-ae6b-45e9-8074-25b7cd52b2d4

来源地址:https://blog.csdn.net/weixin_44123956/article/details/131302964

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录