处理水体问题在很大程度上将是一个数据问题,例如,您只是想错过海洋还是还需要错过小溪流。您需要使用具有所需数据质量的服务,或者需要自己获取数据并在本地运行。从您的编辑中,听起来您想走本地数据路线,因此我将重点介绍一种方法。
一种方法是获取陆地区域或水域的 shapefile。然后,您可以生成一个随机点,并确定它是否与陆地区域相交(或者不与水域区域相交)。
首先,您可能会在此处获得一些低分辨率数据,然后在此处获取更高分辨率的数据,以便在海岸线或湖泊/河流等获得更好的答案时。您提到您希望点的精度达到小数点后5位,这略高于1m。请注意,如果您获取的数据与该精度相匹配,则将拥有一个巨大的数据集。而且,如果您想要真正好的数据,请准备好为此付费。
获得形状数据后,您需要一些工具来帮助您确定随机点的交集。Geotools是一个很好的起点,可能会满足您的需求。您最终还将查看opengis代码(geotools site下的文档 - 不确定他们是否使用了它们或什么)和JTS用于几何处理。使用此功能,您可以快速打开 shapefile 并开始执行一些交集查询。
File f = new File ( "world.shp" );
ShapefileDataStore dataStore = new ShapefileDataStore ( f.toURI ().toURL () );
FeatureSource<SimpleFeatureType, SimpleFeature> featureSource =
dataStore.getFeatureSource ();
String geomAttrName = featureSource.getSchema ()
.getGeometryDescriptor ().getLocalName ();
ResourceInfo resourceInfo = featureSource.getInfo ();
CoordinateReferenceSystem crs = resourceInfo.getCRS ();
Hints hints = GeoTools.getDefaultHints ();
hints.put ( Hints.JTS_SRID, 4326 );
hints.put ( Hints.CRS, crs );
FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2 ( hints );
GeometryFactory gf = JTSFactoryFinder.getGeometryFactory ( hints );
Coordinate land = new Coordinate ( -122.0087, 47.54650 );
Point pointLand = gf.createPoint ( land );
Coordinate water = new Coordinate ( 0, 0 );
Point pointWater = gf.createPoint ( water );
Intersects filter = ff.intersects ( ff.property ( geomAttrName ),
ff.literal ( pointLand ) );
FeatureCollection<SimpleFeatureType, SimpleFeature> features = featureSource
.getFeatures ( filter );
filter = ff.intersects ( ff.property ( geomAttrName ),
ff.literal ( pointWater ) );
features = featureSource.getFeatures ( filter );
快速解释:
- 这假设您获得的 shapefile 是多边形数据。线或点上的交叉点不会给你你想要的东西。
- 第一部分打开形状文件 - 没什么有趣的
- 您必须获取给定文件的几何属性名称
- 坐标系的东西 - 你在帖子中指定了纬度/经度,但GIS可能要复杂得多。通常,我指向您的数据是地理的,wgs84,这就是我在这里设置的数据。但是,如果您不是这种情况,则需要确保在正确的坐标系中处理数据。如果这听起来像是胡言乱语,请谷歌搜索有关GIS/坐标系/基准面/椭圆体的教程。
- 生成坐标几何和过滤器是不言自明的。生成的要素集将为空(如果数据为土地覆被),则表示坐标在水中,或者不为空(表示相反)。
注意:如果你用一组非常随机的点来做到这一点,你将经常打水,你可能需要一段时间才能达到25k点。您可能希望尝试确定点生成的范围,而不是真正随机的(例如删除大西洋/太平洋/印度洋的大块)。
此外,您可能会发现交叉查询速度太慢。如果是这样,您可能需要考虑使用 GDAL 等工具创建四端树索引 (qix)。但是,我不记得geotools支持哪些索引类型。