Java实现GeoJSON点在面上的判断

1、首先引入maven依赖 

        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-geojson</artifactId>
            <version>24.2</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-jts-wrapper</artifactId>
            <version>24.2</version>
        </dependency>

        <dependency>
            <groupId>com.vividsolutions</groupId>
            <artifactId>jts-io</artifactId>
            <version>1.14.0</version>
        </dependency>

2、GeoJSONUtils工具类

import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang3.StringUtils;
import org.geotools.geojson.geom.GeometryJSON;
import org.locationtech.jts.geom.*;
import org.locationtech.jts.io.ParseException;
import org.locationtech.jts.io.WKTReader;
import org.locationtech.jts.io.WKTWriter;

import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;


/**
 * @Description: GeoJSON工具类
 * @author: Mr.xulong
 * @date: 2023年01月09日 14:39
 */
public class GeoJSONUtils {
    /**
     * 判断是否在面上
     * @param x
     * @param y
     * @param geojson
     * @return boolean
     */
    private static boolean surface(double x, double y, String geojson) {
        try{
            String wktStr =  GeoJSONUtils.geojson2Wkt(geojson);
            Point wktPoint = new GeometryFactory().createPoint(new Coordinate(x, y));
            return GeoJSONUtils.contains(wktPoint, wktStr);
        }catch (Exception e){
            return false;
        }
    }

    /**
     * 判断是否在面上
     * @param wktPoint
     * @param wktMapStr
     * @return
     */
    private static boolean contains(Point wktPoint, String wktMapStr) {
        //从WKT字符串读取几何图形
        Geometry g = null;
        try {
            //读取面
            g = new WKTReader().read(wktMapStr);
        } catch (ParseException e) {
            e.printStackTrace();
            return false;
        }
        //计算点是否在面内
        return g.contains(wktPoint);
    }

    public static Geometry geojson2Geometry(String geojson) throws IOException {
        GeometryJSON gjson = new GeometryJSON(7);
        return gjson.read(new StringReader(geojson));
    }

    public static String geometry2Geojson(Geometry geometry) throws IOException {
        GeometryJSON gjson = new GeometryJSON(7);
        StringWriter writer = new StringWriter();
        gjson.write(geometry, writer);
        return writer.toString();
    }

    public static Geometry wkt2Geometry(String wkt) throws ParseException {
        WKTReader reader = new WKTReader();
        return reader.read(wkt);
    }

    public static String geometry2Wkt(Geometry geometry) throws ParseException {
        WKTWriter writer = new WKTWriter();
        return writer.write(geometry);
    }

    /**
     * geojson 转 wtk
     *
     * @param geojson
     * @return
     * @throws Exception
     */
    public static String geojson2Wkt(String geojson) throws Exception {
        Geometry geometry = geojson2Geometry(geojson);
        return geometry2Wkt(geometry);
    }

    /**
     * wkt 转 geojson
     *
     * @param wkt
     * @return
     * @throws Exception
     */
    public static String wkt2Geojson(String wkt) throws Exception {
        Geometry geometry = wkt2Geometry(wkt);
        return geometry2Geojson(geometry);
    }

    /**
     * obj 转
     *
     * @param obj
     * @param <T>
     * @return
     */
    public static <T> String obj2StringPretty(T obj) {
        ObjectMapper mapper = new ObjectMapper();
        if (obj == null) {
            return null;
        }
        try {
            return obj instanceof String ? (String) obj : mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
        } catch (IOException e) {
            return null;
        }
    }

    public static <T> T string2Obj(String str, Class<T> clazz) {
        ObjectMapper mapper = new ObjectMapper();
        if (StringUtils.isEmpty(str) || clazz == null) {
            return null;
        }
        try {
            return clazz.equals(String.class) ? (T) str : mapper.readValue(str, clazz);
        } catch (IOException e) {
            return null;
        }
    }
}

3、调用

String geojson = "{\"type\":\"Polygon\",\"coordinates\":[[[0 0],[ 0 10],[10 20],[20 20],[20 0],[0 0]]]}";
System.out.println("该位置在面上:" +  GeoJSONUtils.surface(1, 1,geojson));

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
判断一个是否在 GeoJSON 中,可以使用 Java 中的 GeoTools 库。下面是一个简单的示例代码,演示了如何使用 GeoTools 库来判断一个是否在一个 GeoJSON 多边形中: ```java import org.geotools.geojson.feature.FeatureJSON; import org.geotools.geometry.jts.JTSFactoryFinder; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.Point; import org.locationtech.jts.geom.Polygon; import org.locationtech.jts.io.ParseException; import org.locationtech.jts.io.WKTReader; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; import java.io.File; import java.io.FileReader; import java.io.IOException; public class GeoJSONPointInPolygon { public static void main(String[] args) throws IOException, ParseException, org.json.simple.parser.ParseException { // 读取 GeoJSON 文件 File file = new File("path/to/your/geojson/file.geojson"); FileReader reader = new FileReader(file); JSONParser jsonParser = new JSONParser(); JSONObject jsonObject = (JSONObject) jsonParser.parse(reader); JSONArray features = (JSONArray) jsonObject.get("features"); JSONObject feature = (JSONObject) features.get(0); JSONObject geometry = (JSONObject) feature.get("geometry"); // 从 GeoJSON 中提取多边形 FeatureJSON featureJSON = new FeatureJSON(); Geometry polygonGeometry = featureJSON.readGeometry(geometry.toJSONString()); Polygon polygon = (Polygon) polygonGeometry; // 创建 Point point = createPoint(39.9042, 116.4074); // 判断是否在多边形中 boolean isInPolygon = polygon.contains(point); System.out.println(isInPolygon); // 输出 true 或 false } // 创建 public static Point createPoint(double x, double y) { org.locationtech.jts.geom.GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(); Point point = geometryFactory.createPoint(new org.locationtech.jts.geom.Coordinate(x, y)); return point; } } ``` 请注意,此示例仅适用于一个多边形的 GeoJSON 文件。如果您需要处理多个多边形,您需要相应地修改代码。此外,您还需要确保您已经添加了必要的依赖项,包括 GeoTools 和 JSON 解析器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值