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));
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
详解Spring系列之@ComponentScan批量注册bean
本文介绍各种@ComponentScan批量扫描注册bean的基本使用以及进阶用法和@Componet及其衍生注解使用,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧2022-02-02
java多线程编程之使用Synchronized关键字同步类方法
JAVA中要想解决“脏数据”的问题,最简单的方法就是使用synchronized关键字来使run方法同步,看下面的代码,只要在void和public之间加上synchronized关键字2014-01-01
Spring Boot自定义Starter组件开发实现配置过程
SpringBoot中的starter是一种非常重要的机制,能够抛弃以前繁杂的配置,将其统一集成进 starter,应用者只需要在maven中引入starter依赖,这篇文章主要介绍了Spring Boot自定义Starter组件开发实现,需要的朋友可以参考下2022-06-06


最新评论