Java某个经纬度是否在genjson文件中问题

 更新时间:2024年11月15日 10:26:07   作者:Liu.jie  
GeoJSON是一种用于地理空间信息数据交换的格式,基于JSON,要判断某个经纬度是否在某个区域内,首先需要解析GeoJSON文件,确定区域边界,然后使用经纬度进行比较

Java某个经纬度是否在genjson文件中

GeoJSON是一种对各种地理数据结构进行编码的格式,基于Javascript对象表示法(JavaScript Object Notation, 简称JSON)的地理空间信息数据交换格式。

如果我们要用某个经纬度是否在某个区域的时候,首先是要用到genjson文件,因为省份地图是一个不规则的图形,需要通过描边来确定是否在区域内部。

我们需要先解析genjson文件

然后在用经纬度去比较,需要提前导入GenJSON的库

      <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-geojson</artifactId>
            <version>23.5</version>
        </dependency>

创建一个对象

import lombok.Data;

@Data
public class LatLng {

    double lat;
    double lng;


    public LatLng(double lat,double lng){
        this.lat = lat;
        this.lng = lng;
    }
}

工具类

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

public class GeojsonUtils {


    /**
     *
     * @param path genjson 位置
     * @param lat 纬度
     * @param lng 经度
     * @return
     */
    public static Boolean getGenjsonPosition(String path,Double lat,Double lng){
        try{
            String jsonString = new String(Files.readAllBytes(Paths.get(path)));
            ObjectMapper objectMapper = new ObjectMapper();
            JsonNode jsonNode = objectMapper.readTree(jsonString);
            JsonNode coordinatesNode = jsonNode.path("features").get(0).path("geometry").path("coordinates").get(0);
            List<LatLng> coordinatesList = new ArrayList<>();

            for (JsonNode coordinate : coordinatesNode) {
                double rlng = coordinate.get(0).asDouble();
                double rlat = coordinate.get(1).asDouble();
                LatLng point = new LatLng(rlat,rlng);
                coordinatesList.add(point);
            }

            LatLng targetPoint = new LatLng(lat, lng);
            boolean isInArea = false;
            int j = coordinatesList.size() - 1;

            for (int i = 0; i < coordinatesList.size(); i++) {
                LatLng point1 = coordinatesList.get(i);
                LatLng point2 = coordinatesList.get(j);

                if ((point1.getLng() < targetPoint.getLng() && point2.getLng() >= targetPoint.getLng()
                        || point2.getLng() < targetPoint.getLng() && point1.getLng() >= targetPoint.getLng())
                        && (point1.getLat() <= targetPoint.getLat() || point2.getLat() <= targetPoint.getLat())) {
                    if (point1.getLat() + (targetPoint.getLng() - point1.getLng()) / (point2.getLng() - point1.getLng())
                            * (point2.getLat() - point1.getLat()) < targetPoint.getLat()) {
                        isInArea = !isInArea;
                    }
                }

                j = i;
            }

            if (isInArea)  return true; //在区域内部
        }catch (Exception e){

        }
        return false; //不在区域内部

    }

    public static void main(String[] args) {
        String filePath = "C:\\Users\\Administrator\\Desktop\\林长制\\shanxi.geojson";
        System.out.println(getGenjsonPosition(filePath,39.34727,108.94647));
    }

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java Bean转Map的那些踩坑实战

    Java Bean转Map的那些踩坑实战

    项目中有时会遇到Map转Bean,Bean转Map的情况,下面这篇文章主要给大家介绍了关于Java Bean转Map那些踩坑的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • MyBatis传入List集合查询数据问题

    MyBatis传入List集合查询数据问题

    这篇文章主要介绍了MyBatis传入List集合查询数据问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • IDEA 的基本介绍使用及断点调试技巧

    IDEA 的基本介绍使用及断点调试技巧

    IDEA 是 JetBrains 公司的产品,总部位于捷克的首都布拉格,IDEA在业界被公认为最好的 Java 开发工具,今天通过本文给大家介绍IDEA 的基本介绍使用及断点调试技巧,感兴趣的朋友跟随小编一起看看吧
    2021-11-11
  • SpringAop源码及调用过程概述

    SpringAop源码及调用过程概述

    这篇文章主要介绍了SpringAop源码及调用过程概述,Spring AOP(面向切面编程)是Spring框架的一个重要特性,它提供了一种在程序运行期间动态地将额外的行为织入到代码中的方式,需要的朋友可以参考下
    2023-10-10
  • springboot如何使用logback-spring配置日志格式,并分环境配置

    springboot如何使用logback-spring配置日志格式,并分环境配置

    这篇文章主要介绍了springboot如何使用logback-spring配置日志格式,并分环境配置的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • ThreadLocal使用案例_动力节点Java学院整理

    ThreadLocal使用案例_动力节点Java学院整理

    这篇文章主要介绍了ThreadLocal使用案例分析,需要的朋友可以参考下
    2017-08-08
  • 如何解决Java多线程死锁问题

    如何解决Java多线程死锁问题

    死锁是一个很严重的、必须要引起重视的问题,本文主要介绍了死锁的定义,解决方法和面试会遇到的问题,感兴趣的可以了解一下
    2021-05-05
  • Spring学习笔记之RedisTemplate的配置与使用教程

    Spring学习笔记之RedisTemplate的配置与使用教程

    这篇文章主要给大家介绍了关于Spring学习笔记之RedisTemplate配置与使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用spring具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-06-06
  • 举例说明JAVA调用第三方接口的GET/POST/PUT请求方式

    举例说明JAVA调用第三方接口的GET/POST/PUT请求方式

    在日常工作和学习中,有很多地方都需要发送请求,这篇文章主要给大家介绍了关于JAVA调用第三方接口的GET/POST/PUT请求方式的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • 一文带你搞懂Java类加载机制

    一文带你搞懂Java类加载机制

    Java 类加载机制是 Java 运行时的核心组成部分,负责在程序运行过程中动态加载和连接类文件,并将其转换为可执行代码,接下来小编就来带大家搞懂面试官老问的 Java 类加载机制,需要的朋友可以参考下
    2023-08-08

最新评论