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


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

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

    所以我们需要先解析genjson文件,然后在用经纬度去比较,需要提前导入GenJSON的库

    1. <dependency>
    2. <groupId>org.geotools</groupId>
    3. <artifactId>gt-geojson</artifactId>
    4. <version>23.5</version>
    5. </dependency>

    创建一个对象

    1. import lombok.Data;
    2. @Data
    3. public class LatLng {
    4. double lat;
    5. double lng;
    6. public LatLng(double lat,double lng){
    7. this.lat = lat;
    8. this.lng = lng;
    9. }
    10. }

    工具类:

    1. import com.fasterxml.jackson.databind.JsonNode;
    2. import com.fasterxml.jackson.databind.ObjectMapper;
    3. import java.nio.file.Files;
    4. import java.nio.file.Paths;
    5. import java.util.ArrayList;
    6. import java.util.List;
    7. public class GeojsonUtils {
    8. /**
    9. *
    10. * @param path genjson 位置
    11. * @param lat 纬度
    12. * @param lng 经度
    13. * @return
    14. */
    15. public static Boolean getGenjsonPosition(String path,Double lat,Double lng){
    16. try{
    17. String jsonString = new String(Files.readAllBytes(Paths.get(path)));
    18. ObjectMapper objectMapper = new ObjectMapper();
    19. JsonNode jsonNode = objectMapper.readTree(jsonString);
    20. JsonNode coordinatesNode = jsonNode.path("features").get(0).path("geometry").path("coordinates").get(0);
    21. List coordinatesList = new ArrayList<>();
    22. for (JsonNode coordinate : coordinatesNode) {
    23. double rlng = coordinate.get(0).asDouble();
    24. double rlat = coordinate.get(1).asDouble();
    25. LatLng point = new LatLng(rlat,rlng);
    26. coordinatesList.add(point);
    27. }
    28. LatLng targetPoint = new LatLng(lat, lng);
    29. boolean isInArea = false;
    30. int j = coordinatesList.size() - 1;
    31. for (int i = 0; i < coordinatesList.size(); i++) {
    32. LatLng point1 = coordinatesList.get(i);
    33. LatLng point2 = coordinatesList.get(j);
    34. if ((point1.getLng() < targetPoint.getLng() && point2.getLng() >= targetPoint.getLng()
    35. || point2.getLng() < targetPoint.getLng() && point1.getLng() >= targetPoint.getLng())
    36. && (point1.getLat() <= targetPoint.getLat() || point2.getLat() <= targetPoint.getLat())) {
    37. if (point1.getLat() + (targetPoint.getLng() - point1.getLng()) / (point2.getLng() - point1.getLng())
    38. * (point2.getLat() - point1.getLat()) < targetPoint.getLat()) {
    39. isInArea = !isInArea;
    40. }
    41. }
    42. j = i;
    43. }
    44. if (isInArea) return true; //在区域内部
    45. }catch (Exception e){
    46. }
    47. return false; //不在区域内部
    48. }
    49. public static void main(String[] args) {
    50. String filePath = "C:\\Users\\Administrator\\Desktop\\林长制\\shanxi.geojson";
    51. System.out.println(getGenjsonPosition(filePath,39.34727,108.94647));
    52. }

  • 相关阅读:
    Real-Time Rendering——7.10 Other Applications其他应用
    Navicate操作说明
    计算机竞赛 深度学习驾驶行为状态检测系统(疲劳 抽烟 喝水 玩手机) - opencv python
    设计模式:适配器模式(C++实现)
    众和策略可靠吗?dde大单净量可信吗?
    智能照明控制系统某大楼大厅照明的应用
    前端面试题合集6-10
    Abp.Zero 手机号免密登录验证与号码绑定功能的实现(二):改造Abp默认实现
    电阻值的优先值
    马斯克调整了Twitter API服务方案
  • 原文地址:https://blog.csdn.net/Liuj666/article/details/133278834