随机地理坐标(在陆地上,避开海洋)

关于如何生成地球上位置的随机坐标(纬度/经度)的任何聪明的想法?纬度/经度。精确到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 );

快速说明:

  1. 假设您获得的shapefile是多边形数据。线或点的相交不会给您想要的东西。
  2. 第一部分打开shapefile-没什么有趣的
  3. 您必须获取给定文件的几何属性名称
  4. 协调系统内容-您在帖子中指定了纬度/经度,但是GIS可能要复杂得多。通常,我指向您的数据是地理数据wgs​​84,这就是我在此处设置的数据。但是,如果不是这种情况,则需要确保以正确的坐标系处理数据。如果这一切听起来像胡言乱语,请在Google周围搜索有关GIS /坐标系/基准/椭球的教程。
  5. 生成坐标几何图形和过滤器是不言自明的。生成的要素集将为空,即如果您的数据为土地覆被,则坐标在水中;或者为空,即相反。

注意:如果您使用一组非常随机的分数来执行此操作,您将经常遇到水,这可能需要一段时间才能达到25k分数。您可能想尝试将点生成的范围比真正随机的范围更好(例如删除大西洋/太平洋/印度洋的大块)。

此外,您可能会发现相交查询过慢。如果是这样,您可能要考虑使用GDAL之类的工具来创建四叉树索引(qix)。不过,我不记得geotools支持哪些索引类型。

以上是 随机地理坐标(在陆地上,避开海洋) 的全部内容, 来源链接: utcz.com/qa/406713.html

回到顶部