导入两个几何列时开普勒地图不起作用
Kepler maps do not work when importing two geometry columns
我可以扩展这个问题来展示一个工作示例,但我认为这是一个错误,而不是编码错误。
我有两个使用 sjoin
连接的独立数据源。 returns 来自 df1
的点位于 df2
.
中概述的多边形内
我想使用 Kepler 导入合并数据集并显示点 和 多边形。
如果我不区分几何列,多边形坐标会在合并后被删除。另一方面,如果我在合并之前从 df2 重命名几何列,它 returns 类型错误。
作为参考,我使用 Kepler (没有 df1) 绘制了 df2 的多边形,它工作正常。
选项 1(删除多边形坐标):
df1 = gpd.read_file('data1.shp')
df2 = gpd.read_file('data2.shp')
df1 = df1(epsg = 4326)
df2 = df1(epsg = 4326)
merge = gpd.sjoin(df1, df2, predicate = 'within', how = 'inner')
map1 = KeplerGl(height = 600)
map1.add_data(merge)
map1
输出:df2 中的几何列丢失。所以不能绘制多边形
选项 2(类型错误):
df1 = gpd.read_file('data1.shp')
df2 = gpd.read_file('data2.shp')
df1 = df1(epsg = 4326)
df2 = df1(epsg = 4326)
df2['geomsaved'] = df2.geometry
merge = gpd.sjoin(df1, df2, predicate = 'within', how = 'inner')
map1 = KeplerGl(height = 600)
map1.add_data(merge)
map1
- 我正在寻找 kepplergl 一个难以使用的库...
- 您的错误是预料之中的,不是错误。具体来说 geopandas 只支持一个 geometry column
- 这是什么意思? kepplergl 将使用
__geo_interface__
从 GeoDataFrame 生成 geojson 然后序列化为要传递给 JavaScript 代码 kepplergl 的字符串。这失败了,因为第二列是未转换为 geojson 的复杂对象的 Series。我在下面复制了这个,在简单的 MWE 中出现了同样的错误
- 如何管理这个?
- 在 kepplergl 中创建两个图层,一个是多边形,另一个是点
- 将几何连接到长 GeoDataFrame 并创建一层
import pandas as pd
import geopandas as gpd
import json
world = gpd.read_file(gpd.datasets.get_path("naturalearth_lowres")).sample(10)
cities = gpd.read_file(gpd.datasets.get_path("naturalearth_cities"))
# does not fail
json.dumps(cities.sjoin(world).__geo_interface__)
# fails: TypeError: Object of type Polygon is not JSON serializable
json.dumps(cities.sjoin(world.assign(poly=lambda d: d["geometry"])).__geo_interface__)
我可以扩展这个问题来展示一个工作示例,但我认为这是一个错误,而不是编码错误。
我有两个使用 sjoin
连接的独立数据源。 returns 来自 df1
的点位于 df2
.
我想使用 Kepler 导入合并数据集并显示点 和 多边形。
如果我不区分几何列,多边形坐标会在合并后被删除。另一方面,如果我在合并之前从 df2 重命名几何列,它 returns 类型错误。
作为参考,我使用 Kepler (没有 df1) 绘制了 df2 的多边形,它工作正常。
选项 1(删除多边形坐标):
df1 = gpd.read_file('data1.shp')
df2 = gpd.read_file('data2.shp')
df1 = df1(epsg = 4326)
df2 = df1(epsg = 4326)
merge = gpd.sjoin(df1, df2, predicate = 'within', how = 'inner')
map1 = KeplerGl(height = 600)
map1.add_data(merge)
map1
输出:df2 中的几何列丢失。所以不能绘制多边形
选项 2(类型错误):
df1 = gpd.read_file('data1.shp')
df2 = gpd.read_file('data2.shp')
df1 = df1(epsg = 4326)
df2 = df1(epsg = 4326)
df2['geomsaved'] = df2.geometry
merge = gpd.sjoin(df1, df2, predicate = 'within', how = 'inner')
map1 = KeplerGl(height = 600)
map1.add_data(merge)
map1
- 我正在寻找 kepplergl 一个难以使用的库...
- 您的错误是预料之中的,不是错误。具体来说 geopandas 只支持一个 geometry column
- 这是什么意思? kepplergl 将使用
__geo_interface__
从 GeoDataFrame 生成 geojson 然后序列化为要传递给 JavaScript 代码 kepplergl 的字符串。这失败了,因为第二列是未转换为 geojson 的复杂对象的 Series。我在下面复制了这个,在简单的 MWE 中出现了同样的错误
- 如何管理这个?
- 在 kepplergl 中创建两个图层,一个是多边形,另一个是点
- 将几何连接到长 GeoDataFrame 并创建一层
import pandas as pd
import geopandas as gpd
import json
world = gpd.read_file(gpd.datasets.get_path("naturalearth_lowres")).sample(10)
cities = gpd.read_file(gpd.datasets.get_path("naturalearth_cities"))
# does not fail
json.dumps(cities.sjoin(world).__geo_interface__)
# fails: TypeError: Object of type Polygon is not JSON serializable
json.dumps(cities.sjoin(world.assign(poly=lambda d: d["geometry"])).__geo_interface__)