import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import org.apache.commons.lang.StringUtils;
import org.geotools.feature.FeatureCollection;
import org.geotools.geojson.feature.FeatureJSON;
import org.geotools.geometry.jts.JTS;
import org.geotools.referencing.CRS;
import org.github.common.util.RestUtil;
import org.locationtech.jts.geom.Coordinate;
import org.opengis.feature.simple.SimpleFeatureType;
import org.opengis.geometry.BoundingBox;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.operation.MathTransform;
import org.opengis.referencing.operation.TransformException;
import java.io.IOException;
public class GeoToolsManager {
public static BoundsData getBounds(JSONObject geojson){
BoundsData boundsData = new BoundsData();
try {
// 解析geojson
String geojsonStr = geojson.toJSONString();
FeatureJSON featureJSON = new FeatureJSON();
// 预先读取geojson的schmea,防止解析时读到空属性报错
SimpleFeatureType simpleFeatureType = featureJSON.readFeatureCollectionSchema(geojsonStr, true);
featureJSON.setFeatureType(simpleFeatureType);
FeatureCollection featureCollection = featureJSON.readFeatureCollection(geojsonStr);
// 获取要素集合的边界
BoundingBox boundingBox = featureCollection.getBounds();
// 打印出来看看
// Double [] bounding = new Double[]{boundingBox.getMinX(), boundingBox.getMinY(), boundingBox.getMaxX(), boundingBox.getMaxY()};
// System.out.println(bounding);
// 根据获取的边界向外扩展一个0.001度的范围,这样更美观
Double[] buffer = {boundingBox.getMinX()-0.001d, boundingBox.getMinY()-0.001d, boundingBox.getMaxX()+0.001d, boundingBox.getMaxY()+0.001d};
// 这个buffer就是bbox
System.out.println(buffer);
// 根据bounds计算图片的长宽比,访问图片时不会变形
double lengthWidthRatio = getLengthWidthRatio(buffer[1], buffer[0], buffer[3], buffer[2]);
// 此次可以设定图片的固定宽度,根据宽高比计算出图片的高度,如果想要高清可以把值改大
// System.out.println(500+","+ Math.round(500*lengthWidthRatio));
boundsData.setWidth(500);
boundsData.setHeight((int)Math.round(500*lengthWidthRatio));
boundsData.setBbox(StringUtils.join(buffer,','));
return boundsData;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
// 转换坐标并计算长宽比
public static double getLengthWidthRatio(double x, double y, double x1, double y1){
CoordinateReferenceSystem crsSource = null;
CoordinateReferenceSystem crsTarget = null;
try {
crsSource = CRS.decode("EPSG:4490");
crsTarget = CRS.decode("EPSG:4524");
MathTransform transform = CRS.findMathTransform(crsSource, crsTarget);
Coordinate source = new Coordinate();
Coordinate target = new Coordinate();
JTS.transform(new Coordinate(x, y), source, transform);
JTS.transform(new Coordinate(x1, y1), target, transform);
System.out.println(source);
System.out.println(target);
return (target.x-source.x)/(target.y-source.y);
} catch (FactoryException e) {
e.printStackTrace();
} catch (TransformException e) {
e.printStackTrace();
}
return 0d;
}
public static void main(String[] args) {
JSONObject jsonObject = RestUtil.get("http://***/geoserver/AAA/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=AAA:overlayAnalysis&outputFormat=application/json&cql_filter=jcbh=rerer");
System.out.println("====================");
System.out.println(jsonObject);
System.out.println("====================");
BoundsData boundsData = GeoToolsManager.getBounds(jsonObject);
System.out.println(boundsData);
}
}
@Data
class BoundsData{
// 图片宽度
private int width;
// 图片高度
private int height;
// bbox
private String bbox;
}
<!-- https://mvnrepository.com/artifact/org.geotools/gt-geojson -->
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-geojson</artifactId>
<version>25.2</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-epsg-hsql</artifactId>
<version>25.2</version>
</dependency>