- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用示例 http://docs.geotools.org/latest/userguide/tutorial/raster/image.html 在 wms 层上叠加一个 shp 文件.
我不断收到错误:
Exception in thread "main" java.lang.UnsupportedOperationException: Trying to get a reader from an unknown format.
at org.geotools.coverage.grid.io.UnknownFormat.getReader(UnknownFormat.java:62)
at com.qedrix.map.maplotr.Demo1.displayLayers(Demo1.java:121)
at com.qedrix.map.maplotr.Demo1.main(Demo1.java:229)
当代码尝试读取 WMS 图像时。
我的代码是这样的:
public class Demo1 {
private AbstractGridCoverage2DReader reader = null;
private StyleFactory sf = CommonFactoryFinder.getStyleFactory();
private FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2();
/**
* This method examines the names of the sample dimensions in the provided
* coverage looking for "red...", "green..." and "blue..." (case insensitive
* match). If these names are not found it uses bands 1, 2, and 3 for the
* red, green and blue channels. It then sets up a raster symbolizer and
* returns this wrapped in a Style.
*
* @return a new Style object containing a raster symbolizer set up for RGB
* image
*/
private Style createRGBStyle() {
GridCoverage2D cov = null;
try {
cov = reader.read(null);
} catch (IOException giveUp) {
throw new RuntimeException(giveUp);
}
// We need at least three bands to create an RGB style
int numBands = cov.getNumSampleDimensions();
if (numBands < 3) {
return null;
}
// Get the names of the bands
String[] sampleDimensionNames = new String[numBands];
for (int i = 0; i < numBands; i++) {
GridSampleDimension dim = cov.getSampleDimension(i);
sampleDimensionNames[i] = dim.getDescription().toString();
}
final int RED = 0, GREEN = 1, BLUE = 2;
int[] channelNum = { -1, -1, -1 };
// We examine the band names looking for "red...", "green...",
// "blue...".
// Note that the channel numbers we record are indexed from 1, not 0.
for (int i = 0; i < numBands; i++) {
String name = sampleDimensionNames[i].toLowerCase();
if (name != null) {
if (name.matches("red.*")) {
channelNum[RED] = i + 1;
} else if (name.matches("green.*")) {
channelNum[GREEN] = i + 1;
} else if (name.matches("blue.*")) {
channelNum[BLUE] = i + 1;
}
}
}
// If we didn't find named bands "red...", "green...", "blue..."
// we fall back to using the first three bands in order
if (channelNum[RED] < 0 || channelNum[GREEN] < 0 || channelNum[BLUE] < 0) {
channelNum[RED] = 1;
channelNum[GREEN] = 2;
channelNum[BLUE] = 3;
}
// Now we create a RasterSymbolizer using the selected channels
SelectedChannelType[] sct = new SelectedChannelType[cov.getNumSampleDimensions()];
ContrastEnhancement ce = sf.contrastEnhancement(ff.literal(1.0), ContrastMethod.NORMALIZE);
for (int i = 0; i < 3; i++) {
sct[i] = sf.createSelectedChannelType(String.valueOf(channelNum[i]), ce);
}
RasterSymbolizer sym = sf.getDefaultRasterSymbolizer();
ChannelSelection sel = sf.channelSelection(sct[RED], sct[GREEN], sct[BLUE]);
sym.setChannelSelection(sel);
return SLD.wrapSymbolizers(sym);
}
public void displayLayers() {
File rasterFile = fetchWmsImage();
AbstractGridFormat format = GridFormatFinder.findFormat(rasterFile);
this.reader = format.getReader(rasterFile);
// Initially display the raster in greyscale using the
// data from the first image band
Style rasterStyle = createRGBStyle();
// Create a basic style with yellow lines and no fill
Style shpStyle = SLD.createPointStyle("point", Color.YELLOW, Color.GRAY, 0.0f, 1.5f);
MapContent map = new MapContent();
map.setTitle("ImageLab");
MapViewport vp = new MapViewport();
org.geotools.map.Layer rasterLayer = new GridReaderLayer(reader, rasterStyle);
map.addLayer(rasterLayer);
saveImage(map, "final.jpeg", 583);
}
public File fetchWmsImage() {
URL url = null;
try {
url = new URL("http://184.106.187.247:8080/geoserver/rg/wms?version=1.1.0");
} catch (MalformedURLException e) {
// will not happen
}
WebMapServer wms = null;
try {
wms = new WebMapServer(url);
WMSCapabilities capabilities = wms.getCapabilities();
Layer[] layers = WMSUtils.getNamedLayers(capabilities);
GetMapRequest request = wms.createGetMapRequest();
request.setFormat("image/png");
request.setDimensions("583", "420");
request.setTransparent(true);
request.setSRS("EPSG:900913");
request.setBBox("-13019428.542822,3922163.1648461,-13013051.407366,3929863.8567165");
request.setProperty("isBaseLayer", "false");
request.setProperty("opacity", ".2");
for (Layer layer : WMSUtils.getNamedLayers(capabilities)) {
if (layer.getName().equals("rg:parcels"))
request.addLayer(layer);
}
GetMapResponse response = (GetMapResponse) wms.issueRequest(request);
BufferedImage image = ImageIO.read(response.getInputStream());
File rasterFile = new File("C:\\Users\\samabhik\\Workspace\\MAP\\data\\out.png");
ImageIO.write(image, "png", rasterFile);
return rasterFile;
} catch (ServiceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
}
return null;
}
public void saveImage(final MapContent map, final String file, final int imageWidth) {
GTRenderer renderer = new StreamingRenderer();
renderer.setMapContent(map);
Rectangle imageBounds = null;
ReferencedEnvelope mapBounds = null;
try {
mapBounds = map.getMaxBounds();
double heightToWidth = mapBounds.getSpan(1) / mapBounds.getSpan(0);
imageBounds = new Rectangle(0, 0, imageWidth, (int) Math.round(imageWidth * heightToWidth));
} catch (Exception e) {
// failed to access map layers
throw new RuntimeException(e);
}
BufferedImage image = new BufferedImage(imageBounds.width, imageBounds.height, BufferedImage.TYPE_INT_RGB);
Graphics2D gr = image.createGraphics();
gr.setPaint(Color.WHITE);
gr.fill(imageBounds);
try {
renderer.paint(gr, imageBounds, mapBounds);
File fileToSave = new File(file);
ImageIO.write(image, "jpeg", fileToSave);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
Demo1 demo = new Demo1();
demo.displayLayers();
}
我的 pom 依赖如下所示:
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-shapefile</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-swing</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-epsg-hsql</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-geotiff</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-image</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-wms</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-coverage</artifactId>
<version>${geotools.version}</version>
</dependency>
我在某处读到它可能是 GDAL 问题。但我不知道如何解决它。我在 64 JDK 1.6 和 Win 7 amd64 上使用 eclipse。
请帮助,某人..
刚刚使用 GDAL native 库路径中的 gdalinfo.exe 测试了图像文件。这是报告:
Driver: PNG/Portable Network Graphics
Files: ..\..\Workspace\MAP\data\out2.png
Size is 583, 420
Coordinate System is `'
Image Structure Metadata:
INTERLEAVE=PIXEL
Corner Coordinates:
Upper Left ( 0.0, 0.0)
Lower Left ( 0.0, 420.0)
Upper Right ( 583.0, 0.0)
Lower Right ( 583.0, 420.0)
Center ( 291.5, 210.0)
Band 1 Block=583x1 Type=Byte, ColorInterp=Red
Mask Flags: PER_DATASET ALPHA
Band 2 Block=583x1 Type=Byte, ColorInterp=Green
Mask Flags: PER_DATASET ALPHA
Band 3 Block=583x1 Type=Byte, ColorInterp=Blue
Mask Flags: PER_DATASET ALPHA
Band 4 Block=583x1 Type=Byte, ColorInterp=Alpha
进一步更新
我刚刚尝试将 WMS 的输出格式从 images/png 更改为 images/geotiff,这现在可以部分工作(geotools 生成的最终图像是黑白的)。为什么会这样?为什么它不适用于 PNG?
最佳答案
检查您是否有可用的 JAI 和 ImageIO。通过 Maven 依赖项,或按照快速入门中的说明将它们安装为 Java 扩展。
更新:
我能够 catch GeoTools IRC channel 并确认这是一个环境问题。在适合我的类(class)中,我能够使用 WMSLab 教程示例连接到有问题的 WMS 并显示结果。
所以让我们检查“问题”环境::
System.out.println( GeoTools.getAboutInfo() );
结果:
GeoTools 版本 9-SNAPSHOT(从 ree5a6830d2c774ee9a4eb9e024d989c2a1bcdfe3 构建) Java版本:1.7.0_09 操作系统:Windows 7 6.1 类路径上的 GeoTools jar :
几个想法:
这成功了!
来自 WorldImageReader::的示例
File input = ...
ImageInputStreamSpi inStreamSPI= ImageIOExt.getImageInputStreamSPI( input );
if (inStreamSPI == null) throw new IllegalStateException("Unsuppported");
显然这没有成功?
最近有人自愿提供了一个 Java 7 build box。当 GeoTools 在 Java 7 中运行时,将更新发行说明和教程。
uDig 项目中的以下代码禁用了 native 实现,从而允许纯 Java 实现对其进行破解::
if (Platform.getOS().equals(Platform.OS_WIN32)) {
try {
// PNG native support is not very good .. this turns it off
ImageUtilities.allowNativeCodec("png", ImageReaderSpi.class, false); //$NON-NLS-1$
} catch (Throwable t) {
// we should not die if JAI is missing; we have a warning for that...
System.out.println("Difficulty turnning windows native PNG support (which will result in scrambled images from WMS servers)"); //$NON-NLS-1$
t.printStackTrace();
}
}
关于gdal - Geotools - 在 WMS 和 OSM 上绘制特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13201902/
有谁知道QGIS中是否支持WMS-T? 通过该应用程序我可以添加 WMS 图层,但我无法使用 WMS-T(没有设置时间参数的地方)。 我一直在浏览 Python 插件,虽然有些插件可以处理时间(时间管
我需要一些帮助。我对 Geoserver 和 WMS 的概念很陌生,我正在寻找非常基本的帮助。我已经下载并安装了 Geoserver,设置了图层等(包括 sld),但是,我不知道如何从这里获取这些信息
我已经使用 PostGIS v2.4.2 扩展配置了 PostgreSQL v9.5.12 数据库。我使用 GeoServer v2.13.1 将数据库表渲染为 WMS 图层,并使用 Openlaye
本文整理了Java中org.geoserver.wms.WMSInfoImpl类的一些代码示例,展示了WMSInfoImpl类的具体用法。这些代码示例主要来源于Github/Stackoverflow
我正在尝试简化我的应用程序,并想知道 OpenLayers 何时物理调用 WMS 服务器?此外,层可见性是否也在调用中起作用? 实例化一个层时会发生吗 var layer = new OpenLaye
我正在尝试进行自动映射。我想要一张不确定性 map ,其中的不确定性由等值线显示。我想导出这些等值线和与它们关联的值,然后通过网络 map 服务显示它们。是否可以?通过以下代码,您可以生成轮廓线 re
我正在尝试使用 OpenLayers 查看 WMS 图层,但未显示任何内容。控制台中未显示任何错误消息。此外,当我尝试使用浏览器 (Firefox) 访问请求字符串时, map 显示得很好。这是代码。
一般来说: 是否可以根据 cql 过滤器或其他参数从单个 wms 查询中对某些 wms 功能进行不同的样式设置? 特别是: 在 wms 查询中,返回特征集合的栅格(即样式为红点的点), 我希望 geo
我正在我的应用程序中实现多个外部 WMS 服务。不幸的是,这些 WMS 服务不传递有关图 block 最小缩放级别的信息,仅传递有关 WMS 图层扩展的信息。有没有办法设置 WMS 开始显示的最小缩放
我使用以下 JavaScript block 来尝试显示 WMS 图层。我正在使用 OpenLayers 2.8。 map 的基础图层 (Openstreetmap) 显示正确,它缩放到正确的区域,“
我正在使用 Google Maps v2 显示来自 wms 的图 block 。我提到了this地点。加载图 block 时出现问题,它们加载了多次我不知道?任何人都可以帮助我吗? 这是我的代码 pa
我目前正在从事仓库管理系统项目: 1.元素大师 2.入境元素 3.向外 由内向外是一个有点复杂的过程。但这不是问题。 一切正常,我想生成报告。我将每个商品的库存存储在 item_stock 表中,该表
我在应用程序中使用 WMS 层,我需要使用新参数刷新它。 我确实正确刷新了 WMS 图层,但我找不到刷新其选择控件的方法。所以我得到了新图层,但无法单击任何点来显示其信息。这是我的一段代码: Laye
我想知道如何使用 openlayers 使 wms 图层透明。 每个非透明层的当前 javascript 如下: var lyr_GDPSETAAirtemperatureC = new ol.lay
我想创建一个面板,用户可以在其中更改所选图层的样式。 对于矢量图层,更新 ol.style 配置没有问题,但我真的不知道如何继续处理 ImageWMS 层。 Based on this post ,我
我正在学习使用 MapServer 创建 WMS 服务,之后我想开发一个可以访问它的 PyQt 桌面应用程序。我不知道最好的方法是什么,因为我见过很多网络解决方案,但这不是我想要的。我也不知道是否有图
我想在 Angular 4 中的 map 中添加一个示例 wms-layer 以及 GeoServer 中的 OpenLayers | 2. 我不知道执行此操作的正确语法。 也许有人在 Angular
我整天都在做这个,老实说,我没有主意了。我有一些 WMS 层,我想根据当前的缩放级别显示/不显示。是的,我已经阅读了 API 文档,它们似乎一如既往地清晰,但我遵循了所有建议,但没有得到想要的结果:(
如何在不调用“removeLayer”的情况下调整传单中的不透明度?我已经在我的 map 上使用了“map.addLayer(myLayer)”。我看到有一个 setParams() 方法,但是当我调
我正在 React Native 中开发一个移动应用程序,需要使用 Web map 服务。我还没有找到任何允许使用 WMS 并同时进行 native react 的库或框架。在React(Web)中我
我是一名优秀的程序员,十分优秀!