随机地理坐标(在陆地上,避开海洋)
关于如何生成地球上位置的随机坐标(纬度/经度)的任何聪明的想法?纬度/经度。精确到5分,避免水体。
double minLat = -90.00; double maxLat = 90.00;
double latitude = minLat + (double)(Math.random() * ((maxLat - minLat) + 1));
double minLon = 0.00;
double maxLon = 180.00;
double longitude = minLon + (double)(Math.random() * ((maxLon - minLon) + 1));
DecimalFormat df = new DecimalFormat("#.#####");
log.info("latitude:longitude --> " + df.format(latitude) + "," + df.format(longitude));
也许我生活在一个梦幻世界中,水的话题是不可避免的……但是希望有一种更好,更清洁,更高效的方法来实现这一目标?
一些奇妙的答案/想法-但是,从规模上讲,我需要生成25,000个坐标。由于延迟,成本和其他一些因素,去外部服务提供商可能不是最好的选择。
回答:
处理水体问题将主要是一个数据问题,例如,您是只想错过海洋还是需要错过小溪流。您需要使用具有所需数据质量的服务,或者需要自己获取数据并在本地运行。从您的编辑看来,您似乎想走本地数据路线,所以我将重点介绍一种方法。
一种方法是获取陆地或水域的shapefile。然后,您可以生成一个随机点,并确定它是否与陆地区域相交(或者,不与水域相交)。
首先,您可能会在这里获得一些低分辨率的数据,然后在这里获得更高分辨率的数据,以便在海岸线或湖泊/河流/等地获得更好的答案时使用。您提到要使点的精度达到小数点后5位,即1m多一点。请注意,如果您获得的数据符合该精度,那么您将拥有一个庞大的数据集。而且,如果您想要非常好的数据,请准备为此付费。
获得形状数据后,需要一些工具来帮助您确定随机点的交点。
Geotools是一个很好的起点,可能会满足您的需求。您还将最终查看opengis代码(geotools网站下的文档-
不确定它们是否消耗了它们或什么)和用于几何处理的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是多边形数据。线或点的相交不会给您想要的东西。
- 第一部分打开shapefile-没什么有趣的
- 您必须获取给定文件的几何属性名称
- 协调系统内容-您在帖子中指定了纬度/经度,但是GIS可能要复杂得多。通常,我指向您的数据是地理数据wgs84,这就是我在此处设置的数据。但是,如果不是这种情况,则需要确保以正确的坐标系处理数据。如果这一切听起来像胡言乱语,请在Google周围搜索有关GIS /坐标系/基准/椭球的教程。
- 生成坐标几何图形和过滤器是不言自明的。生成的要素集将为空,即如果您的数据为土地覆被,则坐标在水中;或者为空,即相反。
注意:如果您使用一组非常随机的分数来执行此操作,您将经常遇到水,这可能需要一段时间才能达到25k分数。您可能想尝试将点生成的范围比真正随机的范围更好(例如删除大西洋/太平洋/印度洋的大块)。
此外,您可能会发现相交查询过慢。如果是这样,您可能要考虑使用GDAL之类的工具来创建四叉树索引(qix)。不过,我不记得geotools支持哪些索引类型。
以上是 随机地理坐标(在陆地上,避开海洋) 的全部内容, 来源链接: utcz.com/qa/406713.html