データ分析実践
中級問題チェック
問題 39 /40
次のGeoJSON形式の文字列に関して、誤った説明はどれか。
geojson = """{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {
"name": "yurakucho"
},
"geometry": {
"type": "Point",
"coordinates": [
35.675056,
139.763333
]
}
}
]
}"""
選択 1
「"type": "Point"」は、「点」を表すgeometory型の記述である。
選択 2
Shapelyのfrom_geojson関数で読み込み、to_geojson関数で書き出すことができる。
選択 3
Shapelyのfrom_geojson関数で、「"name": "yurakucho"」の情報を読み込むことができる。
選択 4
GeoPandasのto_fileメソッドで、GeoJSONファイルに出力することができる。
解説
選択肢3が正解です。
GeoJSONとは、JSONに基づいた地理空間データの記述形式です。点や線、ポリゴンなどの地理的な図形や、それらに関連する属性を表現するために使用されます。
問題文の変数「geojson」は、GeoJSONの記述形式に沿ったPythonの文字列です。
geojson = """{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {
"name": "yurakucho"
},
"geometry": {
"type": "Point",
"coordinates": [
35.675056,
139.763333
]
}
}
]
}"""
【選択肢1】
「"type": "Point"」は、「点」を表すgeometory型の記述である。
正しい説明です。
geometory型の記述を使ってGeoJSON形式にすることで、Jupyter上でオブジェクトを表示したり、他のアプリケーションにファイルを渡すことができます。
Point以外にも、「線」を表すLineStringや、「ポリゴン」を表すPolygonなどがあります。
なお、問題文の35.675056は緯度の値で、139.763333は経度の値です。
緯度は-90〜90の範囲で、経度は-180〜180の範囲になります。緯度は赤道をゼロ度として、北側がプラス符号、南側がマイナス符号になります。経度はグリニッジ子午線をゼロ度として、西側がプラス符号、東側がマイナス符号になります。
また、緯度はlatitude、経度はlongitudeで、latとlonと省略されることがあります。「経度のほうが範囲が広くて長いのでlong」と覚えます。
【選択肢2】
Shapelyのfrom_geojson関数で読み込み、to_geojson関数で書き出すことができる。
正しい説明です。
from_geojson関数で問題文のgeojsonを読み込むと、「POINT (35.67506 139.76333)」というshapelyオブジェクトになります。
Jupyter上で実行すると、次のようにPointが表示されます。
from shapely import from_geojson
shapley_obj = from_geojson(geojson)
shapley_obj
▶︎
このshapelyオブジェクト(shapley_obj)を、GeoJSON形式の文字列に出力するのがto_geojson関数です。
from shapely import to_geojson
geojson2 = to_geojson(shapley_obj, indent=4)
geojson2
▶︎
'''{
"type": "GeometryCollection",
"geometries": [
{
"type": "Point",
"coordinates": [
35.675056,
139.763333
]
}
]
}'''
このように、Shapelyのfrom_geojson関数とto_geojson関数は、GeoJSON形式の文字列を読み書きする関数です。GeoJSON形式のファイルを読み書きする関数ではありません。
【選択肢3】
Shapelyのfrom_geojson関数で、「"name": "yurakucho"」の情報を読み込むことができる。
誤った説明です。
from_geojson関数は、propertiesの情報を読み込むことができません。
問題文のgeojsonには「"name": "yurakucho"」の情報がありますが、選択肢2の解説にあるように、from_geojson関数を使って読み込み、to_geojson関数で書き出す過程で、「"name": "yurakucho"」の情報が消えています。
【選択肢4】
GeoPandasのto_fileメソッドで、GeoJSONファイルに書き出すことができる。
正しい説明です。
問題文のgeojsonを、GeoPandasのread_file関数で読み込むと、GeoDataFrameに変換できます。
import geopandas as gpd
geojson_gdf = gpd.read_file(geojson)
geojson_gdf
▶︎
このようにGeoPandasのread_file関数で読み込むと、propertiesの情報も保持します。
このGeoDataFrameのgeometry列の要素は、shaplyのPointクラスのオブジェクトとなっており、Jupyterで表示することができます。
type(geojson_gdf.loc[0, 'geometry'])
▶︎
shapely.geometry.point.Point
geojson_gdf.loc[0, 'geometry']
▶︎
このGeoDataFrame(geojson_gdf)は、GeoPandasのto_fileメソッドでGeoJSONファイルに出力することができます。
geojson_gdf.to_file('sample.geojson')
sample.geojson
-------------------------------
{
"type": "FeatureCollection",
"crs": {
"type": "name",
"properties": {
"name": "urn:ogc:def:crs:OGC:1.3:CRS84"
}
},
"features": [{
"type": "Feature",
"properties": {
"name": "yurakucho"
},
"geometry": {
"type": "Point",
"coordinates": [
35.675056,
139.763333
]
}
}
]
}
-------------------------------
出力したファイルを、GeoPandasのread_file関数で読み込むこともできます。
このように、GeoPandasのread_file関数はGeoJSON形式の文字列やファイルを読み込む関数で、to_fileメソッドはJSON形式のGeoJSONファイルを出力するメソッドです。
(公式書籍 p.296-301)


