Другой вариант - использовать Shapely (библиотека Python на основе GEOS, движок для PostGIS) и Fiona (которая в основном предназначена для чтения / записи файлов):
import fiona
import shapely
with fiona.open("path/to/shapefile.shp") as fiona_collection:
# In this case, we'll assume the shapefile only has one record/layer (e.g., the shapefile
# is just for the borders of a single country, etc.).
shapefile_record = fiona_collection.next()
# Use Shapely to create the polygon
shape = shapely.geometry.asShape( shapefile_record['geometry'] )
point = shapely.geometry.Point(32.398516, -39.754028) # longitude, latitude
# Alternative: if point.within(shape)
if shape.contains(point):
print "Found shape for point."
Обратите внимание, что выполнение point-in-полигональные тесты могут быть дорогими, если полигон большой / сложный (например, шейп-файлы для некоторых стран с крайне неровными береговыми линиями).В некоторых случаях может помочь использование ограничивающих рамок, чтобы быстро исключить вещи перед выполнением более интенсивного теста:
minx, miny, maxx, maxy = shape.bounds
bounding_box = shapely.geometry.box(minx, miny, maxx, maxy)
if bounding_box.contains(point):
...
Наконец, имейте в виду, что загрузка и анализ больших / нерегулярных шейп-файлов занимает некоторое времяк сожалению, такие типы полигонов зачастую слишком дороги для хранения в памяти).