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 获取边界数据)