Random geographic coordinates (on land, avoid ocean)

前端 未结 16 1099
死守一世寂寞
死守一世寂寞 2020-12-08 10:03

Any clever ideas on how to generate random coordinates (latitude / longitude) of places on Earth? Latitude / Longitude. Precision to 5 points and avoid bodies of water. <

相关标签:
16条回答
  • 2020-12-08 10:20

    This has being asked a long time ago and I now have the similar need. There are two possibilities I am looking into:

    1. Define the surface ranges for the random generator.

    Here it's important to identify the level of precision you are going for. The easiest way would be to have a very relaxed and approximate approach. In this case you can divide the world map into "boxes":

    Each box has it's own range of lat lon. Then you first randomise to get a random box, then you randomise to get a random lat and random long within the boundaries of that box.

    Precisions is of course not the best at all here... Though it depends:) If you do your homework well and define a lot of boxes covering most complex surface shapes - you might be quite ok with the precision.

    2. List item

    Some API to return continent name from coordinates OR address OR country OR district = something that WATER doesn't have. Google Maps API's can help here. I didn't research this one deeper, but I think it's possible, though you will have to run the check on each generated pair of coordinates and rerun IF it's wrong. So you can get a bit stuck if random generator keeps throwing you in the ocean.

    Also - some water does belong to countries, districts...so yeah, not very precise.

    For my needs - I am going with "boxes" because I also want to control exact areas from which the random coordinates are taken and don't mind if it lands on a lake or river, just not open ocean:)

    0 讨论(0)
  • 2020-12-08 10:20

    Supplementary to what bsimic said about digging into GeoNames' Webservices, here is a shortcut:
    they have a dedicated WebService for requesting an ocean name.

    (I am aware the of OP's constraint to not using public web services due to the amount of requests. Nevertheless I stumbled upon this with the same basic question and consider this helpful.)

    Go to http://www.geonames.org/export/web-services.html#astergdem and have a look at "Ocean / reverse geocoding". It is available as XML and JSON. Create a free user account to prevent daily limits on the demo account.

    Request example on ocean area (Baltic Sea, JSON-URL):

    http://api.geonames.org/oceanJSON?lat=54.049889&lng=10.851388&username=demo

    results in

    {
      "ocean": {
        "distance": "0",
        "name": "Baltic Sea"
      }
    }
    

    while some coordinates on land result in

    {
      "status": {
        "message": "we are afraid we could not find an ocean for latitude and longitude :53.0,9.0",
        "value": 15
      }
    }
    
    0 讨论(0)
  • 2020-12-08 10:20

    Assuming Atlantis isn't in the database, you could randomly select cities. This also provides a more realistic distribution of points if you intend to mimic human activity: https://simplemaps.com/data/world-cities

    There's only 7,300 cities in the free version.

    0 讨论(0)
  • 2020-12-08 10:27

    To get a nice even distribution over latitudes and longitudes you should do something like this to get the right angles:

    double longitude = Math.random() * Math.PI * 2;
    double latitude = Math.acos(Math.random() * 2 - 1);
    

    As for avoiding bodies of water, do you have the data for where water is already? Well, just resample until you get a hit! If you don't have this data already then it seems some other people have some better suggestions than I would for that...

    Hope this helps, cheers.

    0 讨论(0)
  • 2020-12-08 10:28

    As a plan B, maybe you can pick a random country and then pick a random coordinate inside of this country. To be fair when picking a country, you can use its area as weight.

    0 讨论(0)
  • 2020-12-08 10:33

    There is a library here and you can use its .random() method to get a random coordinate. Then you can use GeoNames WebServices to determine whether it is on land or not. They have a list of webservices and you'll just have to use the right one. GeoNames is free and reliable.

    0 讨论(0)
提交回复
热议问题