Funktionen zur Geodaten-Indizierung

Mit der Raum-Zeit-Bibliothek können Sie Funktionen nutzen, um Punkte innerhalb einer Region, auf einer Region, die Punkte enthält, sowie Punkte innerhalb eines Radius zu indizieren, um bei der Standortanalyse schnelle Abfragen dieser Daten zu ermöglichen.

Führen Sie die folgenden Schritte aus, um einen räumlichen Index zu erstellen und zu verwenden. Das Beispiel zeigt, wie man einen räumlichen Index nutzt, um anhand bestimmter Suchanfragen zu bestimmten Orten US-Counties zu finden.

  1. Rufe die Kreisgrenzen ab. Verwenden Sie dazu ein `pandas. DataFramegeojson_reader `, um eine ` GeoJSON `-Datei, die die Grenzen der US-Counties enthält, einzulesen, und geben Sie die ersten drei Zeilen des Inhalts aus:

    ! 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. Räumlichen Index für den Landkreis erstellen. pyst bietet mehrere Algorithmen zur räumlichen Indizierung, darunter grid_index, r_star_tree_index und tessellation_index. Das Beispiel zeigt, wie man einen Tessellationsindex erstellt.

    Um einen räumlichen Tessellationsindex zu erstellen, müssen Sie zwei Parameter festlegen:

    • Begrenzungsrahmen : Definiert die Begrenzung des räumlichen Index. Wenn Sie genau wissen, wo sich Ihre Geometrien befinden, und eine Begrenzung definieren können, die alle diese Geometrien umfasst, sollten Sie diese Informationen zur Begrenzungsbox an die Funktion übergeben, da dies die Anzahl der zu erstellenden Kacheln verringert und die Leistung steigert. Wenn Sie die Geometrien jedoch nicht kennen oder auf Nummer sicher gehen möchten, um keine Geometrien auszuschließen, die möglicherweise außerhalb des vorgegebenen Begrenzungsrahmens liegen (beides sind sehr häufige Situationen), können Sie die gesamte Erde als Begrenzungsrahmen verwenden, indem Sie die bboxNone Parametereinstellung einfach auf belassen, was dem Standardwert entspricht.

    • Kachelgröße : Legt die Größe einer Kachel in einem Tessellationsindex fest. Der Wert entspricht der Länge der Fliese in Metern. Für eine bessere Leistung sollten Sie eine Kachelgröße angeben, die in etwa der Größe Ihrer Geometrien entspricht. Wenn Ihre Geometrien beispielsweise 100 km2 sind (d. h. 10^8 m2 ), dann könnte 10^4 m ein guter Wert für die Kachelgröße sein.

      Wenn Sie die Werte für die Begrenzungsbox und die Kachelgröße eingegeben haben, können Sie nun den räumlichen Index erstellen und Ihre Geometrien in den räumlichen Index importieren. Verwenden Sie die from_df Funktion, um die Geometrien aus einem Pandas- DataFrame -Objekt in einen räumlichen Index zu verschieben. Dazu müssen Sie lediglich den Namen der Spalte mit der Geometrie-ID und den Namen der Geometriespalte angeben. Setzen Sie den dritten Parameter, verbosity, der die Protokollverarbeitung steuert, auf error , damit nur Zusammenfassungs- und Fehlerprotokolle angezeigt werden.

      >>> 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. Führen Sie räumliche Indexabfragen durch. Für Abfragen auf einen räumlichen Index stellt die folgenden verschiedenen pyst Abfrage-APIs bereit: 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.

    Beispielabfragen:

    • Zu welchem Landkreis gehört das White Plains Hospital? Welches Verwaltungsgebiet umfasst den Standort des White Plains Hospital?

      >>> white_plains_hospital = stc.point(41.026132, -73.769585)
      >>> si.containing(white_plains_hospital)
      ['Westchester']
      
    • In welchem Landkreis liegt die Stadt White Plains? Welches Kreisgebiet umfasst das Gebiet von 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']
      
    • In welchem Landkreis liegt die Stadt White Plains? Das Ergebnis ist eine Liste von Tupeln mit Wert, Geometrie und Abstand.

      >>> 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)]
      
    • Welche sind die drei nächstgelegenen Landkreise zum White Plains Hospital? Das Ergebnis enthält ihre Entfernungen.

      >>> 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
      
    • Welche Landkreise liegen im Umkreis von 20 km um das White Plains Hospital? Die Ergebnisse sind nach ihrer Entfernung sortiert.

      >>> 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