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

38

有没有聪明的想法来生成地球上地点的随机坐标(纬度/经度)?纬度/经度,精度为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));

也许我活在一个梦幻世界里,水这个话题是不可避免的...但希望有一种更美好、更清洁和更有效的方法来解决这个问题?

编辑

有些很棒的答案/想法——但是,如果我需要生成25000个坐标,去外部服务提供商可能不是最佳选择,因为延迟、成本和其他几个因素。


1
看看这个问题:https://dev59.com/kEfSa4cB1Zd3GeqPBv3F 一些答案非常好。 - Mister Smith
可能会尝试地理哈希 :) http://xkcd.com/426/ - jb.
这段代码不会在极地附近产生相当奇怪的分布吗? - aioobe
16个回答

0
生成很容易,问题是它们不应该在水上。例如,我会导入“Open Streetmap”到这里http://ftp.ecki-netz.de/osm/并将其导入到数据库中(非常简单的数据结构)。我建议使用PostgreSQL,它带有一些地理函数http://www.postgresql.org/docs/8.2/static/functions-geometry.html。为此,您必须将点保存在“多边形”列中,然后可以使用“&&”运算符检查它是否在水面多边形中。对于OpenStreetmap Way-Entry的属性,您应该查看http://wiki.openstreetmap.org/wiki/Category:En:Keys

0

我猜你可以使用世界地图,定义一些点来划定大部分水域,然后使用polygon.contains方法来验证坐标。

更快的算法是使用这张地图,取一些随机点并检查下面的颜色,如果是蓝色,则为水域...当你有了坐标,就将它们转换为经纬度。


为了阐述第二段,我们可以通过创建一个具有纯蓝色的掩码图来映射水体来改进此过程。 - ecle

0

你也可以尝试蓝绿色的方法,然后将所有绿色点存储起来以供以后查找。这样做的好处是“逐步”可细化的。当你想出更好的制作点列表的方法时,你只需将随机抓手指向一个更准确的点组。

也许服务提供商已经回答了你的问题:例如 https://www.google.com/enterprise/marketplace/viewListing?productListingId=3030+17310026046429031496&pli=1

高程 API?http://code.google.com/apis/maps/documentation/elevation/ 是海平面以上还是以下?(对于你没有荷兰点!)


-1

随机点是否必须在全球范围内均匀分布?如果你可以接受一个看似均匀的分布,你可以这样做:

打开你喜欢的地图服务,在美国、俄罗斯、中国、西欧和北非的确切部分内画一个矩形,确保矩形内没有大湖或里海。取每个矩形的角落坐标,然后在这些矩形内随机选择坐标。

你可以保证这些点中没有一个会在任何海洋或湖泊上。你可能会发现偶尔有一条河流,但我不确定有多少地理服务能够准确到那个程度。


-1

从理论和实践角度来看,这是一个非常有趣的问题。最合适的解决方案将在很大程度上取决于您的确切要求。您需要考虑每个水域,还是只考虑主要的海洋?准确性和正确性有多重要;将海洋识别为陆地或反之是否会导致灾难性失败?

我认为机器学习技术将是解决这个问题的绝佳方案,前提是您不介意(希望很小的)概率出现将水点错误分类为陆地。如果这不是问题,那么这种方法应该比其他技术具有更多优势。

使用位图是一个不错的解决方案,简单而优雅。它可以产生指定精度,并且分类保证是正确的(或者至少与您制作的位图一样正确)。但是它的实用性取决于您需要解决方案的准确性。您提到您想要坐标精度达到5个小数位(相当于将整个地球表面映射到最近的米)。使用每个元素1位,位图的大小将达到约73.6TB!

我们并不需要存储所有这些数据;我们只需要知道海岸线在哪里。只要知道一个点相对于海岸的位置,我们就可以确定它是在陆地上还是在海上。根据粗略估计,CIA 世界概况报告称地球上有22498公里的海岸线。如果我们为每一米海岸线存储坐标,并为每个纬度和经度使用32位字,那么这将占用不到1.35GB的存储空间。如果这是一个琐碎的应用程序,这仍然是很多,但比使用位图低几个数量级。然而,如果不需要如此高的精度,这些数字将大大降低。仅将映射缩小到最近的一公里,位图将只有约75GB,全球海岸线的坐标可以适合在软盘中。

我的建议是使用聚类算法来决定一个点是否在陆地上。首先,我们需要足够多的已知坐标,这些坐标已知是在陆地上还是在海上。现有的 GIS 数据库就很合适。然后,我们可以分析这些点以确定陆地和海洋的聚类。决策边界应该落在海岸线上,所有未确定决策边界的点都可以被删除。这个过程可以迭代,以给出一个渐进性更精确的边界。

只需要存储决策边界/海岸线的点,通过使用简单的距离度量,我们可以快速轻松地确定一组坐标是在陆地上还是海洋中。训练系统需要大量资源,但一旦完成分类器将需要非常少的空间或时间。


-1

假设数据库中没有亚特兰蒂斯,您可以随机选择城市。这也提供了更真实的点分布,如果您打算模仿人类活动:https://simplemaps.com/data/world-cities

在免费版本中只有7,300个城市。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接