我们正在构建一项服务,用于上传包含 ESRI 形状文件的 zip 文件。该服务应该能够读取 shapefile 并对其内容进行处理。所以我构建了一个将 zip 文件解压缩到临时文件夹(System.getProperty("java.io.tmpdir") 的子文件夹)的类。
另一个类从 Unzip 类调用 unzip 方法,然后尝试使用 Geotools 读取解压缩的 shapefile。它使用 Geotools DataStoreFinder.getDataStore(Map params) 方法从解压缩的 shapefile 创建数据存储。这里出现了问题:getDataStore 方法返回 null。我测试了 URL,它看起来没问题。 URL 派生的文件存在,是一个文件,可以由应用程序读取(使用 shapefile.exists()、shapefile.isFile()、shapefile.canRead() 进行测试)。那么,可能出什么问题了?为什么返回 null?
这是(相关的)代码:
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.geotools.data.DataStore;
import org.geotools.data.DataStoreFinder;
import org.geotools.data.FeatureSource;
import org.geotools.feature.FeatureCollection;
import org.geotools.feature.FeatureIterator;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
import com.geodan.equus.entity.dataset.BasicFeature;
import com.geodan.equus.exception.EquusException;
import com.geodan.equus.processor.EquusProcessor;
import com.geodan.util.io.UnzipUtils;
import com.vividsolutions.jts.geom.Geometry;
public class ShapefileProcessor implements EquusProcessor
{
private static final File TEMP_UNZIP_DIR = new File(
System.getProperty("java.io.tmpdir") + File.separator
+ "atlas_temp_unzip_dir");
public static Set<BasicFeature> importFeatures(final File zipFile)
throws EquusException
{
// Check if the input file has the zipfile extension
if (!zipFile.getName().endsWith(".zip"))
{
throw new EquusException(
"The file is not a zipfile. It cannot be processed.");
}
// Unzip the file
try
{
UnzipUtils.unzip(zipFile, TEMP_UNZIP_DIR);
}
catch (IOException error)
{
throw new EquusException("The zipfile cannot be unzipped.", error);
}
// Validate whether the unzipped folder contains a shapefile and return it
File shapefile = new File("");
try
{
shapefile = findShapefile(TEMP_UNZIP_DIR);
}
catch (IOException error)
{
throw new EquusException(
"The zipfile does not contain a shapefile. Cannot process its contents.",
error);
}
// Collect the features from the shapefile and put them into an iterator
FeatureIterator<SimpleFeature> featureIterator;
try
{
featureIterator = readShapefile(shapefile);
}
catch (EquusException e)
{
throw new EquusException(e.getMessage(), e);
}
// Create a Set filled with the features in the FeatureIterator
Set<BasicFeature> features = createFeatureSet(featureIterator);
return features;
}
private static File findShapefile(File unzipPath) throws IOException
{
File shapefile = new File("");
// Find first .shp file in the unzip folder
File[] unzippedFiles = unzipPath.listFiles();
for (int i = 0; i < unzippedFiles.length; i++)
{
if (unzippedFiles[i].getName().endsWith(".shp"))
{
shapefile = new File(unzipPath + File.separator
+ unzippedFiles[i].getName());
break;
}
}
if (shapefile.toString() == "")
{
throw new IOException("No shapefile present in '" + unzipPath
+ "'.");
}
return shapefile;
}
private static FeatureIterator<SimpleFeature> readShapefile(File shapefile)
throws EquusException
{
// Collects the features from a shapefile and puts them into an iterator
FeatureCollection<SimpleFeatureType, SimpleFeature> featureCollection;
try
{
Map<String, URL> connectParameters = new HashMap<String, URL>();
connectParameters.put("url", shapefile.toURI().toURL());
DataStore dataStore = DataStoreFinder.getDataStore(connectParameters);
String typeName = dataStore.getTypeNames()[0];
FeatureSource<SimpleFeatureType, SimpleFeature> featureSource = dataStore.getFeatureSource(typeName);
featureCollection = featureSource.getFeatures();
}
catch (Exception e)
{
throw new EquusException(
"Features cannot be retrieved from the shapefile.", e);
}
return featureCollection.features();
}
private static Set<BasicFeature> createFeatureSet(
FeatureIterator<SimpleFeature> featureIterator)
{
SimpleFeature simpleFeature = null;
Set<BasicFeature> features = new HashSet<BasicFeature>();
while (featureIterator.hasNext())
{
simpleFeature = featureIterator.next();
BasicFeature feature = new BasicFeature();
feature.setGeometry((Geometry) simpleFeature.getDefaultGeometry());
features.add(feature);
}
return features;
}
}
最佳答案
只需像这样使用 ShapefileDataStore 的构造函数:
// URL url = file.toURI().toURL();
DataStore shapefileStore = new ShapefileDataStore(url)
关于java - 在 Java 运行时从 zip 文件读取 ESRI shapefile - DataStoreFinder.getDataStore(connectParameters) 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14242111/
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/
HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候
我在破坏脚本的字符串中出现了一些奇怪的字符。据我所知,通过putbadstring到控制台,它们是"\0\0\0\0"。我想对此进行测试,以便我可以忽略它们...但是如何呢?以为这就是blank?和empty?的用途?!?:>badstring="\0"=>"\u0000">badstring.blank?NoMethodError:undefinedmethod`blank?'for"\u0000":Stringfrom(irb):97from/Users/meltemi/.rvm/rubies/ruby-2.0.0-p195/bin/irb:16:in`'>badstring.em
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg
我基本上来自Java背景并且努力理解Ruby中的模运算。(5%3)(-5%3)(5%-3)(-5%-3)Java中的上述操作产生,2个-22个-2但在Ruby中,相同的表达式会产生21个-1-2.Ruby在逻辑上有多擅长这个?模块操作在Ruby中是如何实现的?如果将同一个操作定义为一个web服务,两个服务如何匹配逻辑。 最佳答案 在Java中,模运算的结果与被除数的符号相同。在Ruby中,它与除数的符号相同。remainder()在Ruby中与被除数的符号相同。您可能还想引用modulooperation.