获取wms动态图的边界和宽高

该博客介绍了如何使用GeoTools库解析GeoJSON,获取要素集合的边界,并进行坐标转换。通过计算长宽比,确定图片的尺寸,确保展示时不发生变形。此外,还展示了如何从EPSG:4490转换到EPSG:4524坐标系的过程。
摘要由CSDN通过智能技术生成
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>

要在Cesium中获取WMS图斑的经纬度,可以使用以下方法: 方法1:使用Cesium的内置函数 可以使用Cesium.Cartographic.fromCartesian方法将世界坐标(笛卡尔坐标)转换为经纬度坐标。具体代码如下: ```javascript let cartographic = Cesium.Cartographic.fromCartesian(cartesian); let longitudeString = Cesium.Math.toDegrees(cartographic.longitude); let latitudeString = Cesium.Math.toDegrees(cartographic.latitude); let height = cartographic.height; console.log("经度: " + longitudeString); console.log("纬度: " + latitudeString); console.log("度: " + height); ``` 方法2:使用Cesium的投影函数 可以使用Cesium.WebMercatorProjection类来进行坐标转换。具体代码如下: ```javascript var WMP = new Cesium.WebMercatorProjection(); var cartographic = WMP.unproject(cartesian); var longitudeString = Cesium.Math.toDegrees(cartographic.longitude); var latitudeString = Cesium.Math.toDegrees(cartographic.latitude); var height = cartographic.height; console.log("经度: " + longitudeString); console.log("纬度: " + latitudeString); console.log("度: " + height); ``` 这两种方法都可以将世界坐标转换为经纬度坐标,并且可以获取到相应的度信息。根据你的需求,可以选择使用其中一种方法来获取WMS图斑的经纬度信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Cesium坐标拾取及坐标转换](https://blog.csdn.net/liyan_gis/article/details/127565572)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值