shapefile 边界框未通过 rest api geoserver 正确设置

Posted

技术标签:

【中文标题】shapefile 边界框未通过 rest api geoserver 正确设置【英文标题】:shapefile bounding box not set correctly via rest api geoserver 【发布时间】:2020-05-31 11:27:42 【问题描述】:

嗨,根据question ,我编写了将 Store 和 ShapeFile 添加到 Geoserver 的方法,这些方法可以正常工作,但是当获得图层预览时说 bbox 不正确

非法bbox,minX: 0.0 大于maxX: -1.0

当我从地理服务器 Web 界面手动更改时添加 shapefile 后,它可以正常工作,但我想以编程方式 这是我的代码

 public bool UploadShapeFile()
    

        var uploads = Path.Combine(_host.WebRootPath, "Upload");
        var filePath = Path.Combine(uploads, "states_25.zip");
        string result = Path.GetFileNameWithoutExtension(filePath);
        String fileUri = filePath;
        Console.Write(fileUri);

        byte[] localShapeFile = readLocalShapeFile(fileUri);

        String sUrl = "http://192.168.1.2:8080/geoserver/rest/workspaces" +
            "/sf/datastores/sf3/file.shp";

        WebRequest request = WebRequest.Create(sUrl);

        request.ContentType = "application/zip";
        request.Method = "PUT";
        request.Credentials = new NetworkCredential("admin", "geoserver");

        Stream requestStream = request.GetRequestStream();
        requestStream.Write(localShapeFile, 0, localShapeFile.Length);
        requestStream.Close();

        WebResponse response = request.GetResponse();
        CreatePostGISTableAndFeatureType();
        return true;
    

    public bool CreatePostGISTableAndFeatureType()
    
        string featXml = GetXml();
        string fUrl =   "http://192.168.1.2:8080/geoserver/rest/workspaces" +
            "/sf/datastores/sf3/featuretypes";

        WebRequest request = WebRequest.Create(fUrl);
        request.Method = "POST";
        request.ContentType = "application/xml";
        request.Credentials = new NetworkCredential("admin", "geoserver");

        byte[] buffer = Encoding.GetEncoding("UTF-8").GetBytes(featXml);

        Stream requestStream = request.GetRequestStream();
        requestStream.Write(buffer, 0, buffer.Length);
        requestStream.Close();
        try
        
            WebResponse response = request.GetResponse();
        
        catch (Exception ee)
        

        


        return false;
    
    private string GetXml()
    
        string fXml = "<featureType>" +
                        "<name>sepp</name>" +
                        "<nativeName>sepp</nativeName>" +
                        "<title>sepp</title>" +
                        "<srs>EPSG:4326</srs>" +
                        "<attributes>" +
                            "<attribute>" +
                                "<name>the_geom</name>" +
                                "<binding>com.vividsolutions.jts.geom.Point</binding>" +
                            "</attribute>" +
                            "<attribute>" +
                                "<name>description</name>" +
                                "<binding>java.lang.String</binding>" +
                            "</attribute>" +
                            "<attribute>" +
                                "<name>timestamp</name>" +
                                "<binding>java.util.Date</binding>" +
                            "</attribute>" +
                        "</attributes>" +
                    "</featureType>";
        return fXml;
    

    private byte[] readLocalShapeFile(string filePath)
    
        byte[] buffer;
        FileStream fStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
        try
        
            int length = (int)fStream.Length;
            buffer = new byte[length];
            int count;
            int sum = 0;

            while ((count = fStream.Read(buffer, sum, length - sum)) > 0)
                sum += count;
        
        finally
        
            fStream.Close();
        

        return buffer;
    

非常感谢您的关注

【问题讨论】:

【参考方案1】:

您需要在PUT 发送到服务器的 XML 文件中指定数据集的边界框,或者在请求中包含 recalculate 选项。

查看REST Manual了解完整详情:

重新计算数组字符串

指定是否重新计算特征类型的任何边界框。必要时会自动重新计算要素类型的某些属性。特别是,当投影或投影策略改变时重新计算原生边界框,当重新计算原生边界框或在请求中显式提供新的原生边界框时,重新计算纬度/经度边界框。 (本机和纬度/经度边界框在明确包含在请求中时不会自动重新计算。)此外,客户端可以明确请求一组固定的字段进行计算,方法是在其中包含以逗号分隔的名称列表重新计算参数。空参数“recalculate=”有助于避免在对大型数据集进行操作时缓慢重新计算,因为“recalculate=”可以避免计算任何字段,无论投影、投影策略等如何更改。nativebbox 参数“recalculate=nativebbox”用于重新计算本地边界框,同时避免重新计算纬度/经度边界框。重新计算参数可以一起使用 - 可以在批量导入后使用“recalculate=nativebbox,latlonbbox”来重新计算本地边界框和纬度/经度边界框。

【讨论】:

以上是关于shapefile 边界框未通过 rest api geoserver 正确设置的主要内容,如果未能解决你的问题,请参考以下文章

从包含在 shapefile 边界内的 netcdf 文件中提取数据

确定地理点是不是在州边界的 X 米内(使用 shapefile 获取边界数据)

R:从生成的图像中裁剪 shapefile 边界

使用 GADM shapefile 为美国地图绘制较粗的州边界和较细的县边界

CURL:将带边界的图像发送到 REST API

Facebook Audience API - 使用 Shapefile 定位受众