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
个人学习笔记,记录日常学习,便于查阅及加深,仅为方便个人使用。

浙公网安备 33010602011771号