- 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/
我想从 .osm.pbf 文件中提取一些信息。我查看了 OpenStreetMapX.jl 包,但没有找到读取这些数据的函数。我想知道是否有人知道读取这些数据的方法。或者有没有办法将 .osm.pbf
我第一次尝试了解 MapKit。 与在route-me/mapbox中使用OSM相比,iOS 6 MapKit提供的 map 有什么区别吗? MapKit提供的 map 是Apple的tile服务器提
场景:我想为地址编写自己的自动完成 API,就像 Google 提供的那样。 (非常基本:街道、门牌号码、城市、邮政编码、国家)。它仅供私有(private)使用和培训目的。我想先涵盖大约 100 万
我正在寻找将 Open street map 包含到我的 android 应用程序中的教程/手册或步骤。我所发现的要么是一个具有更多功能的大项目,要么就是很多问题都没有关于“如何”的正确结论而结束..
我正在开发一个桌面应用程序,它需要显示带有一些叠加层的 map 。我有该区域的 .osm 文件和从 OSM 预下载的图 block 。有人知道这个的开源工具吗? 最佳答案 http://code.go
我正在使用 python osmnx 来处理 OpenStreetMap,并且我正在尝试将 networkx map 保存在 .xml 文件中,其结构与从openstreetmap.org。是否可以将
单击标记时不显示 OSM 弹出窗口。我尝试过标记上的点击事件。有效吗?建议我如何在单击标记时在标记上显示弹出窗口。 JS 我尝试过的代码 var newlonLat = new OpenLayers.
有没有人为 OpenStreetMap 使用过以下任何热图 api/scritpts: Bjoern Hoehrmann 的 OpenLayers 热图层:http://www.websitedev.
谁能告诉我如何使用自定义图标在 OSM map 上显示我的当前位置? 最佳答案 使用默认人物图标: MyLocationNewOverlay myLocationoverlay = new MyLoc
我在创建表格连接时遇到了问题。查询永远运行。我在一张表中有开放的街道 map 自行车路线,其中包含所有属性。 Table planet_osm_line osm_id bigint, route te
当尝试在 map 上定义坐标时,我会得到不同的结果,具体取决于我是否对经度/纬度进行硬编码或它们是否来自数据库。 document.title = eventName; document.getEle
我有一个使用 osmdroid 和(非常有用的)osm 奖励包库开发的功能齐全的 Android map 应用程序。我使用了 osmdroid 3.0.10 和 osm Bonus Pack v3.6
从overpass-API读取数据,获取基本字段没有问题。从下面的示例中,可以轻松读取纬度和经度。我无法管理的是读取带有 K=xxxx, v=yyyyy 的各种标签;我需要读取 k="name"的内容
我下载了一个小区域的 Open Street Map 数据,我想过滤数据以获得具有特殊类别的节点。 这是 OSM 数据的示例 我想获取整个学校、医院的数据
我想使用 Polygon 在 Google map 上绘制一个市区区域类和一个纬度/经度坐标数组。 OpenStreetMap 提供了我需要的所有数据——如果我输入一些地区名称,我可以获得 OSM X
我目前正在开发一个基于 OpenStreetMap 的 map 项目,使用 Mapnik、renderd 和 mod_tile(就像 osm 在他们的网站上所做的那样)。 我已经按照一些教程在我的个人
我正在解析 OSM 数据的国家/地区摘录。我想要的是获取该点或路径所属的城市和国家的名称。这可能吗?我怎样才能获得这些信息? 最佳答案 要检索此信息,您需要一个地理编码器,除非该节点具有相关 addr
我正在制作一个使用开放街道 map 的 Web 应用程序,并向其中添加一些标记。我需要删除 map 上的所有图层。 我已经尝试过在其他问题上找到的一些示例,但没有一个对我有用。我不确定我是否使用开放层
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
是否存在从 OSM map 中删除所有地点的方法?还包括商店、酒吧、修复物、酒店等。 我希望使用信息较少的 map 。是否可以从原始 OSM 服务器执行此操作?也许像 URL 中的选项或其他什么?我在
我是一名优秀的程序员,十分优秀!