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));

 

 

https://blog.csdn.net/qq_43564558/article/details/128618012

 

 

 

Geojson判断点是否在面里

 

废话不多说直接上代码

maven

<geotools.version>17.5</geotools.version>
        
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-geojson</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-geometry</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>com.vividsolutions</groupId>
            <artifactId>jts</artifactId>
            <version>1.13</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-epsg-hsql</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-jts-wrapper</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-main</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-opengis</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-referencing</artifactId>
            <version>${geotools.version}</version>
        </dependency>

工具类

/**
     * geo判断点是否在面中
     *
     * @param polygonJson geojson
     * @param lon 经度
     * @param lat 纬度
     * @author polar deer
     * @date 2023/2/1 10:33
     */
    public static boolean isGeoArea(String polygonJson, double lon, double lat) {
        boolean flag = false;
        try {
            //init
            GeometryJSON geo = new GeometryJSON();
            //读取geoJson json串
            Polygon polygon = geo.readPolygon(polygonJson);
            //Geo
            GeometryFactory gf = new GeometryFactory();
            //wgs84坐标系转换->高德坐标系
            double[] doubles = GPS84ToGcUtil.wgs84ToGsj02(lat, lon);
            //判断点是否在区域json内
            flag = polygon.contains(gf.createPoint(new Coordinate(doubles[1], doubles[0])));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return flag;
    }
double[] doubles = GPS84ToGcUtil.wgs84ToGsj02(lat, lon);

上面这里是因为 高德地图坐标系(GCJ-02)和 (WGS-84)不符合所以进行经纬度坐标系转换,正常情况下不需要进行坐标系转换 谨慎使用! 转换代码如下

 

    public static double pi = 3.1415926535897932384626;
    public static double a = 6378245.0;
    public static double ee = 0.00669342162296594323;


    public static boolean outOfChina(double lat, double lon) {
        if (lon < 72.004 || lon > 137.8347)
            return true;
        if (lat < 0.8293 || lat > 55.8271)
            return true;
        return false;
    }

    public static double transformLat(double x, double y) {
        double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x));
        ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
        ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0;
        ret += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0;
        return ret;
    }

    public static double transformLon(double x, double y) {
        double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x));
        ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
        ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0;
        ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0 * pi)) * 2.0 / 3.0;
        return ret;
    }



    public static double[] wgs84ToGsj02(double lat, double lon) {
        if (outOfChina(lat, lon)) {
            return new double[]{lat, lon};
        }
        double dLat = transformLat(lon - 105.0, lat - 35.0);
        double dLon = transformLon(lon - 105.0, lat - 35.0);
        double radLat = lat / 180.0 * pi;
        double magic = Math.sin(radLat);
        magic = 1 - ee * magic * magic;
        double sqrtMagic = Math.sqrt(magic);
        dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
        dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
        double mgLat = lat + dLat;
        double mgLon = lon + dLon;
        return new double[]{mgLat, mgLon};
    }

 

https://blog.csdn.net/weixin_43457585/article/details/128828341

posted @ 2023-08-11 14:59  wq9  阅读(1040)  评论(0)    收藏  举报