天天看点

esri的geometry-api学习

<dependency>
            <groupId>com.esri.geometry</groupId>
            <artifactId>esri-geometry-api</artifactId>
            <version>2.2.3</version>
        </dependency>
           

1、2个geojson是否相交

import com.alibaba.fastjson.JSONObject;
import com.esri.core.geometry.*;
import org.geotools.data.shapefile.ShapefileDataStore;
import org.geotools.data.simple.SimpleFeatureIterator;
import org.geotools.data.simple.SimpleFeatureSource;
import org.geotools.geojson.feature.FeatureJSON;
import org.opengis.feature.simple.SimpleFeature;

import java.io.File;
import java.io.StringWriter;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

    		File[] files = new File("E:\\test").listFiles();
		for (File shapeFile : files) {
			if (shapeFile.getName().endsWith(".shp")) {
				// 使用GeoTools读取ShapeFile文件
				ShapefileDataStore store = new ShapefileDataStore(shapeFile.toURI().toURL());
				//设置编码
				Charset charset = Charset.forName("GBK");
				store.setCharset(charset);
				SimpleFeatureSource sfSource = store.getFeatureSource();
				SimpleFeatureIterator sfIter = sfSource.getFeatures().features();
				// 从ShapeFile文件中遍历每一个Feature,然后将Feature转为GeoJSON字符串
				List<String> ls = new ArrayList<>();
				while (sfIter.hasNext()) {
					SimpleFeature feature = sfIter.next();
					// Feature转GeoJSON
					FeatureJSON fjson = new FeatureJSON();
					StringWriter writer = new StringWriter();
					fjson.writeFeature(feature, writer);
					String sjson = writer.toString();
					JSONObject featureStr = JSONObject.parseObject(sjson);
					String geojson = featureStr.get("geometry").toString();
					ls.add(geojson);
					MapGeometry mapGeometry = GeometryEngine.geoJsonToGeometry(geojson,
							WktImportFlags.wktImportDefaults, com.esri.core.geometry.Geometry.Type.Polygon);
					com.esri.core.geometry.Geometry polygon = mapGeometry.getGeometry();
//					double l = GeometryEngine.distance(polygon,new Point(108.41, 30.81),SpatialReference.create(4326));
					boolean b = isWithin(108.49, 30.77,polygon,0.2);
					System.out.println("l = " + b);
				}
				System.out.println("数据导入完成,共耗时" + (System.currentTimeMillis() - start) + "ms");
			}
		}

	// Disjoint	判断两个图形间是否没有相同点
	public static boolean isWithin(double lon, double lat, com.esri.core.geometry.Geometry p, double dis) throws Exception {//dis=20000大约0.2度
		String geojson = "{\"type\":\"Polygon\",\"coordinates\":[[["+(lon-dis)+","+(lat-dis)+"],["+(lon+dis)+","+(lat+dis)+"],[" +
				""+(lon-dis)+","+(lat+dis)+"],["+(lon+dis)+","+(lat-dis)+"]]]}";
		MapGeometry mapGeometry = GeometryEngine.geoJsonToGeometry(geojson,
				WktImportFlags.wktImportDefaults, com.esri.core.geometry.Geometry.Type.Polygon);
		return GeometryEngine.disjoint(mapGeometry.getGeometry(), p, SpatialReference.create(4326));
	}
           
相等(Equals): 几何形状拓扑上相等。
脱节(Disjoint): 几何形状没有共有的点。
相交(Intersects): 几何形状至少有一个共有点(区别于脱节)
接触(Touches): 几何形状有至少一个公共的边界点,但是没有内部点。
交叉(Crosses): 几何形状共享一些但不是所有的内部点。
内含(Within): 几何形状A的线都在几何形状B内部。
包含(Contains): 几何形状B的线都在几何形状A内部(区别于内含)
重叠(Overlaps): 几何形状共享一部分但不是所有的公共点,而且相交处有他们自己相同的区域。
缓冲区分析(Buffer) 包含所有的点在一个指定距离内的多边形和多多边形
凸壳分析(ConvexHull) 包含几何形体的所有点的最小凸壳多边形(外包多边形)
交叉分析(Intersection) 交叉操作就是多边形AB中所有共同点的集合。
联合分析(Union) AB的联合操作就是AB所有点的集合。
差异分析(Difference) AB形状的差异分析就是A里有B里没有的所有点的集合。
对称差异分析(SymDifference) AB形状的对称差异分析就是位于A中或者B中但不同时在AB中的所有点的集合

参考:https://blog.csdn.net/objectively/article/details/35219605?utm_source=blogxgwz3

继续阅读