使用我发现的示例,我能够连接到Web服务,下载世界地图并在JMapPane中正确显示。我的目标是让JMapPane只显示世界上非常特定的部分。
我有一个基于NAD83和UTM 17N的地理CRS。我更喜欢使用Northing和Easting值,我想要显示该区域的边界。
以下是相关代码:
Rectangle bounds=projectdata.getPlanRange();
ReferencedEnvelope envelope = new ReferencedEnvelope(bounds.getMinX(), bounds.getMaxX(), bounds.getMinY(), bounds.getMaxY(), projectdata.getWorkPlancrs());
mapPane.setDisplayArea(envelope);
如果我没有用信封设置显示区域,我会看到世界。如果我设置它,它会让我看到世界某处的水。我只能假设ReferencedEnvelope可以使用提供的地理CRS处理Northing / Easting值。我已经阅读了几次文档并在发布此问题之前搜索了很长时间。我确信对于我做错了有一个简单的答案。
如果它很重要,我使用的wms源是
http://atlas.gc.ca/cgi-bin/atlaswms_en?VERSION=1.1.1&Request=GetCapabilities&Service=WMS
答案 0 :(得分:0)
您没有说明如何在JFrame中创建地图。但是下面的内容适用于我(需要注意一些注意事项,我将在下面介绍)。诀窍是使用您需要的CRS和边界框设置视口。您可以获得full code here。
private void createWMS() {
content.getViewport().setCoordinateReferenceSystem(crs);
content.getViewport().setBounds(bbox);
if (url == null) {
throw new IllegalStateException("URL is not set");
}
try {
wms = new WebMapServer(url);
} catch (ServiceException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.exit(2);
}
WMSCapabilities capabilities = wms.getCapabilities();
org.geotools.data.ows.Layer[] wmsLayers = WMSUtils.getNamedLayers(capabilities);
for (org.geotools.data.ows.Layer wmsLayer : wmsLayers) {
if(layers.isEmpty()) {//just write out layers
System.out.println(wmsLayer.getName());
}
if (layers.contains(wmsLayer.getName())) {
WMSLayer displayLayer = new WMSLayer(wms, wmsLayer);
if (!styles.isEmpty()) {
String wmsStyle = styles.get(layers.indexOf(wmsLayer.getName()));
displayLayer = new WMSLayer(wms, wmsLayer);
List<StyleImpl> layerStyles = wmsLayer.getStyles();
for (StyleImpl s : layerStyles) {
if (s.getName().equalsIgnoreCase(wmsStyle)) {
displayLayer.setStyle((Style) s);
}
}
}
content.addLayer(displayLayer);
}
}
}
这会产生CRS设置为EPSG:26917和大约-157051,5400992,279239,5664905的地图的bbox,如:
正如您所见,这项服务即将结束!并且它也不能很好地处理EPSG:26917,因为它已经在地球另一侧绘制了俄罗斯的“背面”并在绘制加拿大之前对其进行了标记,这有点令人困惑,如果你进一步缩小地图就会变成地图由于边界和河流等在地图“后面”穿越而无法使用。