Check if geo-point is inside or outside of polygon

发布于 2021-01-29 15:08:15

I am using python and I have defined the latitudes and longitudes (in degrees)
of a polygon on the map. My goal is to check if a generic point P of
coordinates x,y falls within such polygon. I would like therefore to have a
function that allows me to check such condition and return True or False
if the point is inside or outside the polygon.

enter image description
here

In this example the point is outside so the result would be False

Question : Is there a library/package that allows to reach my goal? if yes
which one do you recommend? would you be able to give a small example on how
to use it?

Here is the code I have written so far:

import numpy as np

# Define vertices of polygon (lat/lon)
v0 = [7.5, -2.5] 
v1 = [2, 3.5]
v2 = [-2, 4]
v3 = [-5.5, -4]
v4 = [0, -10]
lats_vect = np.array([v0[0],v1[0],v2[0],v3[0],v4[0]])
lons_vect = np.array([v0[1],v1[1],v2[1],v3[1],v4[1]])

# Point of interest P
x, y = -6, 5 # x = Lat, y = Lon

## START MODIFYING FROM HERE; DO NOT MODIFY POLYGON VERTICES AND DATA TYPE
# Check if point of interest falls within polygon boundaries
# If yes, return True
# If no, return False

In order to plot the polygon and the point of interest I used cartopy and I
wrote the following lines of code:

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
ax = plt.axes(projection=ccrs.PlateCarree())
ax.stock_img()

# Append first vertex to end of vector to close polygon when plotting
lats_vect = np.append(lats_vect, lats_vect[0])
lons_vect = np.append(lons_vect, lons_vect[0])
plt.plot([lons_vect[0:-1], lons_vect[1:]], [lats_vect[0:-1], lats_vect[1:]],
         color='black', linewidth=1, 
         transform=ccrs.Geodetic(),
         )

plt.plot(y, x, 
        '*',          # marker shape
        color='blue',  # marker colour
        markersize=8  # marker size
        )

plt.show()

Note :

  • points are connected to each other by Great Circles!
  • I have researched in the internt and I ended up finding some similar questions like this one but I had no success since they all use of .shp files which I do not have.
关注者
0
被浏览
57
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    Here is a possible solution to my problem.

    1. Geographical coordinates must be stored properly. Example np.array([[Lon_A, Lat_A], [Lon_B, Lat_B], [Lon_C, Lat_C]])
    2. Create the polygon
    3. Create the point to be tested
    4. Use polygon.contains(point) to test if point is inside (True) or outside (False) the polygon.

    Here is the missing part of the code:

    from shapely.geometry import Point
    from shapely.geometry.polygon import Polygon
    
    lons_lats_vect = np.column_stack((lons_vect, lats_vect)) # Reshape coordinates
    polygon = Polygon(lons_lats_vect) # create polygon
    point = Point(y,x) # create point
    print(polygon.contains(point)) # check if polygon contains point
    print(point.within(polygon)) # check if a point is in the polygon
    

    Note : the polygon does not take into account great circles, therefore it
    is necessary to split the edges into many segments thus increasing the number
    of vertices.


    Special case: If point lies on borders of Polygon

    E.g. print(Polygon([(0, 0), (1, 0), (1, 1)]).contains(Point(0, 0))) will
    fail

    So one can use

    print(polygon.touches(point)) # check if point lies on border of polygon
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看