Analyse des données géospatiales
Vous pouvez utiliser la bibliothèque géospatiale et temporelle pour étendre vos analyses de données à l'analyse géographique, en collectant, en traitant et en affichant des images, des données GPS, des photographies satellites et des données historiques.
Vous pouvez utiliser la bibliothèque géospatio-temporelle disponible sur Cloud Pak for Data pour :
- Exécutez des tâches Spark sur votre cluster Cloud Pak for Data à l'aide des API REST pour les tâches Spark disponibles sur Analytics Engine powered by Apache Spark. Voir la section « Premiers pas avec la bibliothèque ».
- Exécutez des notebooks dans des environnements Spark sur Watson Studio. Voir la bibliothèque géospatiale et temporelle pour les notebooks.
Premiers pas avec la bibliothèque
Avant de pouvoir utiliser la bibliothèque dans une application, vous devez vous inscrire STContext pour pouvoir accéder aux st fonctions.
Pour s'inscrire STContext:
from pyst import STContext
stc = STContext(spark.sparkContext._gateway)
Fonctions permettant de lire et d'écrire des données
pyst prend en charge la plupart des formats géospatiaux courants, notamment geoJSON et WKT.
GeoJSON format
Pour travailler avec des fichiers au format « geoJSON », commencez par créer un lecteur et un enregistreur « geoJSON » :
geojson_reader = stc.geojson_reader()
geojson_writer = stc.geojson_writer()
Les extraits de code suivants montrent comment lire des données de localisation en temps réel au format « geoJSON » disponibles sur Mapbox :
Lisez le contenu d'un fichier « GeoJSON » copié depuis Mapbox sur votre ordinateur et affichez les trois premières lignes du fichier :
! wget -q https://www.mapbox.com/help/data/stations.geojson df = geojson_reader.read('stations.geojson') df.head(3)Lire du contenu au format « GeoJSON » à partir d'un dictionnaire « Python » :
data = json.load(open('stations.geojson')) df = geojson_reader.read(data) df.head(3)Lisez les données directement depuis Mapbox à l'aide d'un flux de données ( URL ) et affichez les trois premières lignes du fichier :
df = geojson_reader.read('https://www.mapbox.com/help/data/stations.geojson') df.head(3)Lire des données binaires (utile notamment pour lire des octets en continu depuis IBM Cloud Object Storage, par exemple) :
# Assume station.geojson is in IBM Cloud Object Storage in the bucket "test" client = ibm_boto3.client('s3') streaming_body_2 = client.get_object(Bucket='test', Key='station.geojson')['Body'] df = shapefile_reader.read(streaming_body_2.read()) df.head(3)Copiez le contenu d'un objet pandas de type « DataFrame » dans un dictionnaire de type « Python » :
geojson_writer.write(df)Enregistrer le contenu d'un objet pandas de type « DataFrame » dans un fichier « GeoJSON » :
geojson_writer.write(df, file_name='stations_out.geojson')
Chaînes WKT
Pour travailler avec des chaînes WKT, commencez par créer un lecteur et un enregistreur WKT :
wkt_reader = stc.wkt_reader()
wkt_writer = stc.wkt_writer()
Les extraits de code suivants montrent comment lire et écrire dans une chaîne WKT :
Lire une chaîne WKT dans un objet géométrique :
>>> westchester_WKT = 'POLYGON((-73.984 41.325,-73.948 41.33,-73.78 41.346,-73.625 41.363,-73.545 41.37,-73.541 41.368,-73.547 41.297,-73.485 41.223,-73.479 41.215,-73.479 41.211,-73.493 41.203,-73.509 41.197,-73.623 41.144,-73.628 41.143,-73.632 41.14,-73.722 41.099,-73.714 41.091,-73.701 41.073,-73.68 41.049,-73.68 41.047,-73.673 41.041,-73.672 41.038,-73.668 41.035,-73.652 41.015,-73.651 41.011,-73.656 41,-73.655 40.998,-73.656 40.995,-73.654 40.994,-73.654 40.987,-73.617 40.952,-73.618 40.946,-73.746 40.868,-73.751 40.868,-73.821 40.887,-73.826 40.886,-73.84 40.89,-73.844 40.896,-73.844 40.9,-73.85 40.903,-73.853 40.903,-73.854 40.9,-73.859 40.896,-73.909 40.911,-73.92 40.912,-73.923 40.914,-73.923 40.918,-73.901 40.979,-73.894 41.023,-73.893 41.043,-73.896 41.071,-73.894 41.137,-73.94 41.207,-73.965 41.24,-73.973 41.244,-73.975 41.247,-73.976 41.257,-73.973 41.266,-73.95 41.288,-73.966 41.296,-73.98 41.309,-73.984 41.311,-73.987 41.315,-73.987 41.322,-73.984 41.325))' >>> westchester = wkt_reader.read(westchester_WKT) >>> westchester.area() 1363618331.5760047 >>> westchester.centroid() Point(41.15551622739597, -73.7592843233704) >>> westchester.get_bounding_box() BoundingBox: Lower Corner: Point(40.86800000000001, -73.987), Upper Corner: Point(41.36999999999998, -73.479)Enregistrer un objet géométrique sous forme de chaîne WKT :
>>> wkt_writer.write(westchester) 'POLYGON ((-73.984 41.325, -73.987 41.322, -73.987 41.315, -73.984 41.311, -73.98 41.309, -73.966 41.296, -73.95 41.288, -73.973 41.266, -73.976 41.257, -73.975 41.247, -73.973 41.244, -73.965 41.24, -73.94 41.207, -73.894 41.137, -73.896 41.071, -73.893 41.043, -73.894 41.023, -73.901 40.979, -73.923 40.918, -73.923 40.914, -73.92 40.912, -73.909 40.911, -73.859 40.896, -73.854 40.9, -73.853 40.903, -73.85 40.903, -73.844 40.9, -73.844 40.896, -73.84 40.89, -73.826 40.886, -73.821 40.887, -73.751 40.868, -73.746 40.868, -73.618 40.946, -73.617 40.952, -73.654 40.987, -73.654 40.994, -73.656 40.995, -73.655 40.998, -73.656 41.0, -73.651 41.011, -73.652 41.015, -73.668 41.035, -73.672 41.038, -73.673 41.041, -73.68 41.047, -73.68 41.049, -73.701 41.073, -73.714 41.091, -73.722 41.099, -73.632 41.14, -73.628 41.143, -73.623 41.144, -73.509 41.197, -73.493 41.203, -73.479 41.211, -73.479 41.215, -73.485 41.223, -73.547 41.297, -73.541 41.368, -73.545 41.37, -73.625 41.363, -73.78 41.346, -73.948 41.33, -73.984 41.325))'
Saisie directe
Outre la lecture d'objets géométriques provenant de différentes sources, la saisie directe est également prise en charge et chaque type de géométrie dispose d'un constructeur :
- Remarque :
point(lat, lon) - LineSegment:
line_segment(start_point, end_point) - LineString:
line_string([point_1, point_2, …])ouline_string([line_segment_1, line_segment_2, …]) - Bague :
ring([point_1, point_2, …]) or ring([line_segment_1, line_segment_2, …]) - Polygon :
polygon(exterior_ring, [interior_ring_1, interior_ring_2, …]) - MultiGeometry:
multi_geometry(geom_1, geom_2, …) - MultiPoint:
multi_point(point_1, point_2, …) - MultiLineString:
multi_line_string(line_string_1, line_string_2, …) - MultiPolygon:
multi_polygon(polygon_1, polygon_2, …) - Géométrie nulle :
null_geometry() - FullEarth:
full_earth() - BoundingBox:
bounding_box(lower_lat, lower_lon, upper_lat, upper_lon)
Quelques exemples :
point_1 = stc.point(37.3, -74.4)
point_2 = stc.point(37.5,-74.1)
point_3 = stc.point(38.1, -74.4)
line_segment = stc.line_segment(point_1, point_2)
line_string = stc.line_string([point_1, point_2, point_3])
ring = stc.ring([point_1, point_2, point_3, point_1])
poly = stc.polygon(ring)
multi_points = stc.multi_point([point_1, point_2, point_3])
>>> poly.area()
1179758985.44891
>>> multi_points
MultiPoint(Point(37.5, -74.1), Point(38.1, -74.4), Point(37.3, -74.4))
>>> next(multi_points)
Point(37.5, -74.1)
>>> next(multi_points)
Point(38.1, -74.4)
>>> next(multi_points)
Point(37.3, -74.4)
En savoir plus
Découvrez comment utiliser les autres fonctions de la bibliothèque géospatio-temporelle :