我有一个函数,可以读取一组坐标并得到UTM坐标。后来我将这些UTM坐标转换为WGS84。当此数据来自 4 个文件集(shp、.dbf、.shx 和 .prj(时,没有问题。
这是我获取坐标并转换它们的代码:
public Geometry getGeometryDistrict(String refCatDistrict, String shapeFileDistrict){
Geometry union = null;
File shapeFile = new File (shapeFileDistrict);
try {
Query query = new Query();
query.setCoordinateSystem(DefaultGeographicCRS.WGS84);
Filter filter = CQL.toFilter("obj_co_id = '"+refCatDistrict+"'");
query.setFilter(filter);
FileDataStore storeDistrict = FileDataStoreFinder.getDataStore(shapeFile);
SimpleFeatureSource featureSource = storeDistrict.getFeatureSource();
SimpleFeatureCollection collection = featureSource.getFeatures(query);
SimpleFeature fDistrict = null;
ArrayList<Geometry> geometries = new ArrayList<>();
SimpleFeatureIterator itrDistrict = collection.features();
while(itrDistrict.hasNext()){
fDistrict = itrDistrict.next();
Geometry geomDistrict = (Geometry)fDistrict.getDefaultGeometry();
geometries.add(geomDistrict);
}
GeometryFactory factory = new GeometryFactory();
GeometryCollection geometryCollection = (GeometryCollection) factory.buildGeometry( geometries );
union = geometryCollection.union();
itrDistrict.close();
storeDistrict.dispose();
}catch(IOException | NoSuchElementException | CQLException e){
Throwable cause = e.getCause();
System.out.println(cause);
}
return union;
}
我的问题是这些数据并不总是有 .prj 文件(需要转换坐标(,只有 3 个文件到达(.dbf、.shp 和 .shx(。
我的疑问是:有没有办法在没有 .prj 文件的情况下将 UTM 坐标转换为 WGS84?
如果没有 prj,则无法将 UTM 坐标转换为 WGS84。您需要中央子午线或UTM区进行转换。
但是有一个解决方法。您可以使用世界 UTM 区域 来预测 UTM 区域。如果您知道确切的区域,则可以执行此操作。然后使用反复试验,您可以转换并检查附近的 2-3 个区域。
我找到了这个解决方案,显然它工作正常:
try{
CoordinateReferenceSystem sourceutm = CRS.decode(String.format("AUTO2:42001,%s,%s", -3.691406, 40.403431), true);
CoordinateReferenceSystem targetlatlong = CRS.decode("EPSG:4326", true);
MathTransform transform = CRS.findMathTransform(sourceutm, targetlatlong, false);
Geometry union = JTS.transform( geometryCollection, transform);
System.out.println(union.toString());
}catch(MismatchedDimensionException | FactoryException | TransformException e){
throw new RuntimeException(e);
}
当然,这是在里面。并从UTM返回给我一个度坐标。不需要 .pjr。