当前位置: 首页 > 面试题库 >

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

佘茂才
2023-03-14
问题内容

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



 类似资料:
  • 我正在建立一个机器学习模型,其中一些列是物理地址(我可以将其转换为X / Y坐标),但我对ML算法如何处理这一点有点困惑。有没有一种特定的方法可以将地理位置转换成列,以便用于ML(分类和/或回归)中? 提前感谢!

  • 问题内容: 我有一个包含地理数据的SQLite数据库。我的表是这样定义的: 接下来,我的软件(Java)使用一个简单的SQL请求来寻找GEO_OBJECTS,如下所示: 从GEO_OBJECTS中选择*纬度<= 123.4和纬度> = 26.32和经度<= 12.41和经度> = 6.23; 如果我在纬度和经度上创建索引,是否可以改善性能? 接下来,当我得到此查询的结果时,我正在使用Haversi

  • 我应该自己写方法吗?尽管我害怕不能解释一些事情,因为我的数学已经生疏了。或者我能为Java找到一个现成的实现吗?我有谷歌地图sdk在我的项目,但我找不到任何有用的东西。

  • 功能介绍        地理编码指将结构化内容转换为经纬度坐标,逆地理编码指将经纬度坐标转换成结构化地址。使用该功能模块,可以快速批量把Excel文件内的大量地址转换为经纬度信息,或者实现反查。        当前功能模块使用高德接口。由于地理编码与逆地理编码需要使用高德API接口,而API接口日请求次数有限,公共API KEY无法满足大批量请求,使用自己申请的高德KEY可以解决该问题,因此需要申

  • 功能介绍        地理编码指将结构化内容转换为经纬度坐标,逆地理编码指将经纬度坐标转换成结构化地址。使用该功能模块,可以快速批量把Excel文件内的大量地址转换为经纬度信息,或者实现反查。        当前功能模块使用高德接口。由于地理编码与逆地理编码需要使用高德API接口,而API接口日请求次数有限,公共API KEY无法满足大批量请求,使用自己申请的高德KEY可以解决该问题,因此需要申

  • 问题内容: 我正在使用elasticsearch1.4.1-1.4.4。我正在尝试将地理多边形形状(文档)索引到索引中,现在在对形状进行索引时,我想知道地理坐标是否位于该特定索引的地理多边形形状的边界内。 使用上面的地理多边形过滤器,我可以使所有索引的地理坐标都位于所描述的多边形内,但是我还需要知道未索引的地理坐标是否位于此地理多边形中。我的怀疑是,在elasticsearch1.4.1中是否可行