Funciones de indexación geoespacial

Con la biblioteca espacio-temporal, puedes utilizar funciones para indexar puntos dentro de una región, en una región que contenga puntos y puntos dentro de un radio, con el fin de permitir consultas rápidas sobre estos datos durante el análisis de ubicación.

Siga estos pasos para crear y utilizar un índice espacial. El ejemplo muestra cómo utilizar un índice espacial para buscar condados de EE. UU. a partir de consultas sobre ubicaciones concretas.

  1. Consulta los límites de los condados. Para ello, utiliza un geojson_reader para leer un archivo « GeoJSON », que contiene los límites de los condados de EE. UU., en un objeto pandas « DataFrame » y muestra las tres primeras líneas del contenido:

    ! wget -q http://eric.clst.org/assets/wiki/uploads/Stuff/gz_2010_us_050_00_20m.json
    county_df = geojson_reader.read('gz_2010_us_050_00_20m.json')
    county_df.head(3)
    
  2. Crear un índice espacial de condados. pyst ofrece varios algoritmos de indexación espacial, entre los que se incluyen grid_index, r_star_tree_index y tessellation_index. El ejemplo muestra cómo crear un índice de teselación.

    Para crear un índice espacial de teselación, es necesario configurar dos parámetros:

    • Cuadro delimitador : define los límites del índice espacial. Si sabes exactamente dónde se encuentran tus geometrías y puedes definir un límite que las contenga todas, debes pasar esta información del cuadro delimitador a la función, ya que así se reducirá el número de mosaicos que hay que crear y se mejorará el rendimiento. Sin embargo, si no conoces las geometrías o prefieres ir sobre seguro para no excluir ninguna geometría que pudiera quedar fuera del rectángulo delimitador dado (ambas son situaciones muy habituales), puedes utilizar toda la Tierra como rectángulo delimitador simplemente dejando el valor bbox del parámetro en None, que es el valor predeterminado.

    • Tamaño de mosaico : define el tamaño de un mosaico en un índice de teselación. El valor viene dado por la longitud de la baldosa, expresada en metros. Para obtener un mejor rendimiento, debes especificar un tamaño de mosaico similar al de tus geometrías. Por ejemplo, si tus geometrías tienen un tamaño de 100 km2 (es decir, 10^8 m2 ), entonces 10^4 m podría ser un buen valor para el tamaño de los mosaicos.

      Una vez que dispongas de los valores del cuadro delimitador y del tamaño de los mosaicos, ya puedes crear el índice espacial e importar tus geometrías a dicho índice. Utiliza la from_df función para trasladar las geometrías de un índice de pandas ( DataFrame ) a un índice espacial. Para ello, solo tienes que indicar el nombre de la columna del ID de geometría y el nombre de la columna de geometría. Establezca el tercer parámetro, verbosity, que controla el procesamiento de los registros, en error para que solo se muestren los registros de resumen y de errores.

      >>> tile_size = 100000
      >>> si = stc.tessellation_index(tile_size=tile_size) # we leave bbox as None to use full earth as boundingbox
      >>> si.from_df(county_df, 'NAME', 'geometry', verbosity='error')
      3221 entries processed, 3221 entries successfully added
      
  3. Realizar consultas en índices espaciales. Para realizar consultas en un índice espacial, pyst ofrece las siguientes API de consulta: contained_in, contained_in_with_info, containing, containing_with_info intersects, intersects_with_info,, within_distance, within_distance_with_info, nearest_neighbors, nearest_neighbors_with_info.

    Ejemplos de consultas:

    • ¿A qué condado pertenece el White Plains Hospital? ¿Qué polígono de condado contiene la ubicación del Hospital White Plains?

      >>> white_plains_hospital = stc.point(41.026132, -73.769585)
      >>> si.containing(white_plains_hospital)
      ['Westchester']
      
    • ¿En qué condado se encuentra la ciudad de White Plains? ¿Qué polígono de condado contiene el polígono de White Plains?

      >>> white_plains_WKT = 'POLYGON((-73.792 41.024,-73.794 41.031,-73.779 41.046,-73.78 41.049,-73.779 41.052,-73.776 41.054,-73.775 41.057,-73.767 41.058,-73.769 41.062,-73.768 41.067,-73.762 41.073,-73.759 41.074,-73.748 41.069,-73.746 41.056,-73.742 41.056,-73.74 41.053,-73.74 41.049,-73.749 41.04,-73.748 41.035,-73.739 41.034,-73.729 41.029,-73.725 41.025,-73.72 41.016,-73.717 41.015,-73.716 41.006,-73.718 41.002,-73.732 40.988,-73.732 40.985,-73.739 40.979,-73.745 40.978,-73.749 40.981,-73.749 40.986,-73.751 40.986,-73.756 40.991,-73.759 40.991,-73.76 40.993,-73.765 40.994,-73.769 40.997,-73.774 41.002,-73.775 41.006,-73.788 41.018,-73.792 41.024))'
      >>> wkt_reader = stc.wkt_reader()
      >>> white_plains = wkt_reader.read(white_plains_WKT)
      >>> si.containing(white_plains)
      ['Westchester']
      
    • ¿En qué condado se encuentra la ciudad de White Plains? El resultado es una lista de tuplas que contienen el valor, la geometría y la distancia.

      >>> si.containing_with_info(white_plains)
      [('Westchester',
         MultiPolygon(Polygon: Boundary: Ring(LineSegment(Point(40.886299, -73.767176), Point(40.886899, -73.767276)), LineSegment(Point(40.886899, -73.767276), Point(40.887599, -73.768276)), LineSegment(Point(40.887599, -73.768276), Point(40.888399, -73.770576)), ...) Interiors: , Polygon: Boundary: Ring(LineSegment(Point(41.198434, -73.514617), Point(41.200814, -73.509487)), LineSegment(Point(41.200814, -73.509487), Point(41.21276, -73.482709)), LineSegment(Point(41.21276, -73.482709), Point(41.295422, -73.550961)), ...) Interiors: ),
         0.0)]
      
    • ¿Cuáles son los tres condados más cercanos al White Plains Hospital? El resultado incluye sus distancias.

      >>> counties = si.nearest_neighbors_with_info(white_plains_hospital, 3)
      >>> for county in counties:
      ...     print(county[0], county[2])
      Westchester 0.0
      Fairfield 7320.602641166855
      Rockland 10132.182241119823
      
    • ¿Cuáles son los condados situados a menos de 20 km del White Plains Hospital? Los resultados se ordenan por distancia.

      >>> counties = si.within_distance_with_info(white_plains_hospital, 20000)
      >>> counties.sort(key=lambda tup: tup[2])
      >>> for county in counties:
      ...     print(county[0], county[2])
      Westchester 0.0
      Fairfield 7320.602641166855
      Rockland 10132.182241119823
      Bergen 10934.1691335908
      Bronx 15683.400292349625
      Nassau 17994.425235412604