Verify if a point is Land or Water in Google Maps

后端 未结 18 1666
不知归路
不知归路 2020-11-22 17:16

..and then Google-maps \"divide the waters from the waters\"

Well, not in the biblical sense but..

I would like to know what options I have in order to verif

相关标签:
18条回答
  • 2020-11-22 17:59

    I thought it was more interesting to do this query locally, so I can be more self-reliant: let's say I want to generate 25000 random land coordinates at once, I would rather want to avoid calls to possibly costly external APIs. Here is my shot at this in python, using the python example mentionned by TomSchober. Basically it looks up the coordinates on a pre-made 350MB file containing all land coordinates, and if the coordinates exist in there, it prints them.

    import ogr
    from IPython import embed
    import sys
    
    drv = ogr.GetDriverByName('ESRI Shapefile') #We will load a shape file
    ds_in = drv.Open("land_polygons.shp")    #Get the contents of the shape file
    lyr_in = ds_in.GetLayer(0)    #Get the shape file's first layer
    
    #Put the title of the field you are interested in here
    idx_reg = lyr_in.GetLayerDefn().GetFieldIndex("P_Loc_Nm")
    
    #If the latitude/longitude we're going to use is not in the projection
    #of the shapefile, then we will get erroneous results.
    #The following assumes that the latitude longitude is in WGS84
    #This is identified by the number "4236", as in "EPSG:4326"
    #We will create a transformation between this and the shapefile's
    #project, whatever it may be
    geo_ref = lyr_in.GetSpatialRef()
    point_ref=ogr.osr.SpatialReference()
    point_ref.ImportFromEPSG(4326)
    ctran=ogr.osr.CoordinateTransformation(point_ref,geo_ref)
    
    def check(lon, lat):
        #Transform incoming longitude/latitude to the shapefile's projection
        [lon,lat,z]=ctran.TransformPoint(lon,lat)
    
        #Create a point
        pt = ogr.Geometry(ogr.wkbPoint)
        pt.SetPoint_2D(0, lon, lat)
    
        #Set up a spatial filter such that the only features we see when we
        #loop through "lyr_in" are those which overlap the point defined above
        lyr_in.SetSpatialFilter(pt)
    
        #Loop through the overlapped features and display the field of interest
        for feat_in in lyr_in:
            # success!
            print lon, lat
    
    check(-95,47)
    

    I tried a dozen coordinates, it works wonderfully. The "land_polygons.shp" file can be downloaded here, compliments of OpenStreetMaps. (I used the first WGS84 download link myself, maybe the second works as well)

    0 讨论(0)
  • 2020-11-22 18:02

    This method is totally unreliable. In fact, the returned data will totally depend on what part of the world you are working with. For example, I am working in France. If I click on the sea on the coast of France, Google will return the nearest LAND location it can "guess" at. When I requested information from Google for this same question, they answered that they are unable to accurately return that the point requested in on a water mass.

    Not a very satisfactory answer, I know. This is quite frustrating, especially for those of us who provide the user with the ability to click on the map to define a marker position.

    0 讨论(0)
  • 2020-11-22 18:03

    These are 2 different ways, you may try:

    • You can use Google Maps Reverse Geocoding . In result set you can determine whether it is water by checking types. In waters case the type is natural_feature. See more at this link http://code.google.com/apis/maps/documentation/geocoding/#Types.

      Also you need to check the names of features, if they contain Sea, Lake, Ocean and some other words related to waters for more accuracy. For example the deserts also are natural_features.

      Pros - All detection process will be done on client's machine. No need of creating own server side service.

      Cons - Very inaccurate and the chances you will get "none" at waters is very high.

    • You can detect waters/lands by pixels, by using Google Static Maps. But for this purpose you need to create http service.

      These are steps your service must perform:

      1. Receive latitude,longitude and current zoom from client.
      2. Send http://maps.googleapis.com/maps/api/staticmap?center={latitude,longitude}&zoom={current zoom`}&size=1x1&maptype=roadmap&sensor=false request to Google Static Map service.
      3. Detect pixel's color of 1x1 static image.
      4. Respond an information about detection.

      You can't detect pixel's color in client side. Yes , you can load static image on client's machine and draw image on canvas element. But you can't use getImageData of canvas's context for getting pixel's color. This is restricted by cross domain policy.

      Prons - Highly accurate detection

      Cons - Use of own server resources for detection

    0 讨论(0)
  • 2020-11-22 18:04

    See the answer I gave to a similar question - it uses "HIT_TEST_TERRAIN" from the Earth Api to achieve the function.

    There is a working example of the idea I put together here: http://www.msa.mmu.ac.uk/~fraser/ge/coord/

    0 讨论(0)
  • 2020-11-22 18:07

    If List<Address> address returns 0 , you can assume this location as ocean or Natural Resources.Just add Below Code in Your response Method of Google Places API Response.

    Initialize Below List as mentioned

    List<Address> addresses = geocoder.getFromLocation(latLng.latitude, latLng.longitude, 1);

    if (addresses.size()==0) { Toast.MakeText(getApplicationContext,"Ocean or Natural Resources selected",Toast.LENGTH_SHORT).show(); }else{ }

    0 讨论(0)
  • 2020-11-22 18:09

    If all else fails you could always try checking the elevation at the point and for some distance about - not many things other than water tend to be completely flat.

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