Cómo puedo encontrar el país utilizando información de latitud y longitud usando Pyspark & shapely.
Tengo dos tablas, una presenta todos los países y sus polígonos y multipolígonos respectivos. La otra presenta puntos de latitud y longitud (dist_base
).
Mi objetivo es “unir” mis datos de puntos a sus respectivos países. Estoy usando Pyspark
y no puedo usar geopandas
, por lo que estoy utilizando shapely
, pero la forma en que lo estoy implementando es muy lenta.
¿Tiene algún consejo sobre el uso de shapely
? La idea sería verificar en qué polígono está ubicado mi punto.
Lo que intenté es verificar polígono por polígono (almacenado en geodata_countries_geo
), si el punto está dentro, si es así, recuperar el código ISO3 asociado (almacenado en un diccionario geodata_countries_geo_dict
).
import shapely.wkt as wkt
def check<em>nearest</em>country(lat, lon):
point = Point(lon, lat)
for geometry in geodata<em>countries</em>geo:
polygon = wkt.loads(geometry[0])
if polygon.contains(point):
return str(geodata<em>countries</em>geo_dict.get(str(geometry[0])))
<h1>registro udf</h1>
check<em>nearest</em>country<em>udf = f.udf(lambda x,y: str(check</em>nearest_country(x,y)), StringType())
<h1>aplicar</h1>
dist<em>base = dist</em>base.withColumn('Country<em>Base</em>ISO3', check<em>nearest</em>country_udf(f.col("lat"),f.col("lon")))
davy.ai
Una forma de optimizar tu implementación actual es usar la Indexación Espacial. Shapely proporciona una implementación de la estructura de indexación R-tree llamada
shapely.strtree
. La idea es usar esta estructura de datos para encontrar rápidamente qué polígonos contienen el punto dado. Aquí hay un ejemplo de cómo puedes modificar tu función para usar el R-tree:Esta implementación debería ser más rápida ya que usa un R-tree para filtrar polígonos que no intersectan con el punto. Ten en cuenta que estamos usando
geodata_countries_poly
en lugar degeodata_countries_geo
porque STRtree requiere objetos Shapely como entrada, no cadenas WKT. Además, devolverNone
en lugar de una cadena si no se encuentra ningún polígono coincidente es una cuestión de preferencia personal.