[英]WMS Layer not rendered properly on all zoom levels
我已经用PostGIS v2.4.2扩展名配置了PostgreSQL v9.5.12数据库。 我使用GeoServer v2.13.1将数据库表呈现为WMS图层,并使用Openlayers(v4.6.5)在webapp中可视化它们。 使用的投影为EPSG:31255 。
但是,WMS图层未在所有缩放级别上正确显示。 有时,瓷砖会被切除(请参见屏幕截图1),或者并非渲染图层中的每个点(请参见屏幕截图2)。 在某些级别上,尤其是放大时,该图层完全不会显示。 图层在GeoServer本身中正确显示,并将其添加到qGIS中即可。
我也将此设置和代码用于其他图层,并且工作流畅,但是这些图层使用不同的投影(ESPG:4326)。
我怎样才能解决这个问题?
编辑:这是一个代码段,其中包括EPSG:31255的定义,而实际上未将其用于wmsSource。
// proj4js custom projection
proj4.defs("EPSG:31255","+proj=tmerc +lat_0=0 +lon_0=13.33333333333333 +k=1 +x_0=0 +y_0=-5000000 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m +no_defs");
var proj31255 = ol.proj.get('EPSG:31255');
proj31255.setExtent([-115771.3204, 130037.7189, 115359.4571, 408002.5351]);
var wmsSource = new ol.source.TileWMS({
url: geoserver_getcapabilities_url + geoserver_workspace + '/wms?',
params: {
'LAYERS': wms_layer_name
},
serverType: 'geoserver',
//projection: 'EPSG:31255'
});
var wmsLayer = new ol.layer.Tile({
source: wmsSource,
name: 'selected_wms_layer',
visible: true
});
var osmLayer = new ol.layer.Tile({
source: new ol.source.OSM()
});
var view = new ol.View({
center: map_centre,
zoom: initial_zoom_level,
projection: 'EPSG:3857'
});
/** Set-up the map */
var map = new ol.Map({
target: 'map',
layers: [osmLayer, wmsLayer, point_layer],
overlays: [overlay],
view: view,
loadTilesWhileAnimating: true,
loadTilesWhileInteracting: true,
controls: ol.control.defaults().extend([
new ol.control.OverviewMap()
])
});
TL; DR: OpenLayers网站上提供了一个出色的工作示例
(在以下示例中,我使用的职位应该在奥地利的某个地方)
首先,让我们确保正确设置了EPSG:31255。 如评论中所述,我建议您使用proj4js,如果您必须处理投影,它将使您的生活更轻松。
将proj4js库导入应用程序后,声明EPSG:31255投影,如下所示:
proj4.defs("EPSG:31255","+proj=tmerc +lat_0=0 +lon_0=13.33333333333333 +k=1 +x_0=0 +y_0=-5000000 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m +no_defs");
(您可以使用epsg.io作为源在proj4js中导入很多投影: https : //epsg.io/31255.js )
提示: 在 OpenLayers 之前导入proj4js,它将在OpenLayers中使用而无需额外的工作。
现在,我们需要使用一个考虑了这一新投影的视图来创建或更新OpenLayers地图。
let myMap = new ol.Map({
target: myDOMElement,
layers: [...],
view: new ol.View({
center: ol.proj.fromLonLat([50163.181015, 255280.097217]),
zoom: 5,
projection: 'EPSG:31255'
})
});
现在,您可能很难设置正确的中心,因为必须在EPSG:31255投影中设置其坐标。
为了简化操作,我建议例如使用基于EPSG:4326的Transform。
view: new ol.View({
// Converts from coordinates known in EPSG:4326 to coordinates in EPSG:31255
center: ol.proj.transform([13.7548828125, 47.43896484375], 'EPSG:4326', 'EPSG:31255'),
zoom: 5,
projection: 'EPSG:31255' // Projection you want the map to use
})
那如果对不同的图层有不同的投影该怎么办?
只需在TileWMS中指定它们(确保它们都已声明)即可。
let myWMSSource = new ol.source.TileWMS({
url: myURL,
params: {
'LAYERS': 'myCustomLayer'
},
serverType: 'geoserver',
projection: 'EPSG:31255' // Declare the projection the source is in.
});
OpenLayers应该自动将它们重新投影到地图投影中。
/** Set a source */
let myWMSSource = new ol.source.TileWMS({
url: myURL,
params: {
'LAYERS': 'myCustomLayer'
},
serverType: 'geoserver',
projection: 'EPSG:31255'
});
/** Create a custom tile layer */
let myLayerTile = new ol.layer.Tile({
source: myWMSSource,
name: 'MyTile',
visible: true
});
/**
* Create a layer using OSM.
* Note that ol.source.OSM uses EPSG:3857
*/
let OSMLayer = new ol.layer.Tile({
source: new ol.source.OSM()
});
/** Set-up the map */
let myMap = new ol.Map({
target: DOMElement,
layers: [OSMLayer, myLayerTile],
view: new ol.View({
center: ol.proj.fromLonLat([1549123.872774, 6044640.196792]),
zoom: 1,
projection: 'EPSG:3857'
}),
loadTilesWhileAnimating: true,
loadTilesWhileInteracting: true,
controls: ol.control.defaults().extend([
new ol.control.OverviewMap()
])
});
出现此类问题的常见原因是使用标准WMS作为TileWMS
层的基础。 这会在客户端和服务器中引起各种问题。
利用提供的WMTS或TMS端点从GeoServer / GeoWebCache请求图块。 例如,此页面显示了正确执行操作的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.