标签: geopandas

将GeoDataFrame写入SQL数据库

我希望我的问题不是荒谬的,因为令人惊讶的是,这个问题在热门网站上显然还没有被提及(据我所知).

情况是我有几个csv文件,总共包含超过1个Mio观测值.每个观察都包含一个邮政地址.我打算将所有文件读入单个GeoDataFrame,对地址进行地理编码,在给定shapefile的情况下执行空间连接,并为每行保存多边形中的一些信息.我想这是相当标准的.这是一次性数据清理过程的一部分.

我的目标是使用此最终数据集设置数据库.这是因为它允许我非常容易地共享和搜索数据,以及例如在网站上绘制一些观察结果.此外,它使得根据某些标准选择观察结果变得非常容易,然后进行一些分析.

我的问题是插入GeoDataFrame到数据库的功能似乎并没有被还没有实现 - 这显然是因为GeoPandas应该是对数据库的一个替补多("GeoPandas使您可以轻松地做在巨蟒行动,否则将需要的空间数据库,作为PostGIS").

当然,我可以遍历每一行并"手动"插入每个数据点,但我在这里寻找最佳解决方案.对于任何解决方法,我也担心数据类型可能与数据库的数据类型冲突.这里有"最好的方式"吗?

谢谢你的帮助.

python mysql pandas geopandas

7
推荐指数
2
解决办法
4248
查看次数

b从ANSI 1252到UTF-8的重新编码失败,错误:"无效的参数".geopandas python

我试图将shapefile读入GeoDataFrame.

通常我只是这样做,它的工作原理:

import pandas as pd

import geopandas as gpd
from shapely.geometry import Point

df = gpd.read_file("wild_fires/nbac_2016_r2_20170707_1114.shp")
Run Code Online (Sandbox Code Playgroud)

但这一次它给了我错误: b'Recode from ANSI 1252 to UTF-8 failed with the error: "Invalid argument".'

完整错误:

---------------------------------------------------------------------------
CPLE_AppDefinedError                      Traceback (most recent call last)
<ipython-input-14-adcad0275d30> in <module>()
----> 1 df_wildfires_2016 = gpd.read_file("wild_fires/nbac_2016_r2_20170707_1114.shp")

/usr/local/lib/python3.6/site-packages/geopandas/io/file.py in read_file(filename, **kwargs)
     19     """
     20     bbox = kwargs.pop('bbox', None)
---> 21     with fiona.open(filename, **kwargs) as f:
     22         crs = f.crs
     23         if bbox is not None:

/usr/local/lib/python3.6/site-packages/fiona/__init__.py in open(path, mode, driver, schema, …
Run Code Online (Sandbox Code Playgroud)

python shapefile geopandas

7
推荐指数
1
解决办法
1387
查看次数

使用user_defined分类方案绘制等值区域图(使用geopandas)

我是python的新手,所以我希望我的问题的答案相对简单.

我正在尝试使用geopandas制作一个等值线图.但是,由于我正在制作需要相互比较的多个地图,因此使用自定义数据分类方案(而不是分位数或jenks)是必不可少的.因此,我一直在尝试使用User_Defined方案,我能够创建垃圾箱,但我不知道如何将它们应用到地图本身.

这就是我创建分类方案时所做的:

    import pysal.esda.mapclassify as ps
    from pysal.esda.mapclassify import User_Defined

    bins = [5, 20, 100, 600, 1000, 3000, 5000, 10000, 20000, 400000]
    ud = User_Defined(projected_world_exports['Value'], bins)
Run Code Online (Sandbox Code Playgroud)

(其中'Value'是我在地图中绘制的列)

然后,当我尝试绘制等值线图时,我不知道该方案的意图是什么

    projected_world_exports.plot(column='Value', cmap='Greens', scheme = ?????)
Run Code Online (Sandbox Code Playgroud)

如果有人可以提供帮助,我将非常感激!

谢谢x

python user-defined bins geopandas choropleth

6
推荐指数
2
解决办法
3055
查看次数

Geopandas 设置几何图形:MultiPolygon“等于 len 键和值”的 ValueError

我有 2 个带有几何列的地理数据框,我将一些几何图形从 1 个复制到另一个。

这对于多边形效果很好,但对于任何(有效)多多边形都会返回 ValueError。

请指教如何解决这个问题?我不知道是否/如何/为什么应该更改 MultiPolygon 以获得“相等的长度键和值”?

geodata01.loc[index, 'geometry'] = geodata02.loc[index, 'geometry']
Run Code Online (Sandbox Code Playgroud)

这对于多边形效果很好。只有使用 MultiPolygons 我才能得到:

ValueError 
if len(labels) != len(value):
--> 611      raise ValueError('Must have equal len keys and value '
    612      'when setting with an iterable')
Run Code Online (Sandbox Code Playgroud)

我也无法对缓冲或简化的 MultiPolygon 进行分配(MultiPolygon 是有效的,我可以绘制、缓冲、简化,但无法分配它):

geodata01.loc[index, 'geometry'] = geodata01.loc[index, 'geometry'].buffer(0)
#or
geodata01.loc[index, 'geometry'] = geodata01.loc[index, 'geometry'].simplify(tolerance=0)
Run Code Online (Sandbox Code Playgroud)

这会返回相同的 ValueError。

python pandas shapely geopandas

6
推荐指数
1
解决办法
1837
查看次数

Change background map for contextily

I have this code:

import pandas as pd
import numpy as np
from geopandas import GeoDataFrame
import geopandas
from shapely.geometry import LineString, Point
import matplotlib.pyplot as plt
import contextily

''' Do Something'''

df = start_stop_df.drop('track', axis=1)
crs = {'init': 'epsg:4326'}
gdf = GeoDataFrame(df, crs=crs, geometry=geometry)

ax = gdf.plot()
contextily.add_basemap(ax)
ax.set_axis_off()
plt.show()
Run Code Online (Sandbox Code Playgroud)

Basically, this generates a background map that is in Singapore. However, when I run it, I get the following error: HTTPError: Tile URL resulted in a 404 error. Double-check …

python python-3.x geopandas contextily

6
推荐指数
2
解决办法
748
查看次数

为什么 Pandas 和 GeoPandas 能够使用 DBAPI (psycopg2) 连接读取数据库表,但必须依赖 SQLAlchemy 来编写数据库表?

语境

我在尝试从脚本对某些数据库执行一些 I/O 操作时遇到了麻烦Python3

当我想要连接到数据库时,我习惯性地使用psycopg2to 来处理连接游标

我的数据通常存储为and/or的等效项。 Pandas DataFramesGeoPandasGeoDataFrames

困难

为了数据库表中读取数据;

使用Pandas

我可以依赖它.read_sql()作为参数的方法con,如文档中所述:

con : SQLAlchemy connectable (engine/connection) or database str URI
        or DBAPI2 connection (fallback mode)'
        Using SQLAlchemy makes it possible to use any DB supported by that
        library. If a DBAPI2 object, only sqlite3 is supported. The user is responsible
        for engine disposal and connection closure …
Run Code Online (Sandbox Code Playgroud)

sqlalchemy psycopg2 dataframe pandas geopandas

6
推荐指数
1
解决办法
8387
查看次数

Plotly:如何为离散分类变量设置等值线图颜色?

我试图绘制一张世界地图,其中包含所有具有不同风险级别(低、中和高)的国家。我想为每个风险级别设置不同的颜色,但不确定如何更改配色方案,以便每个风险类别都有我选择的颜色。

df.risk 变量目前低为 1,中等为 2,高为 3,因此它是一个连续变量,但是我想使用离散的,


fig = go.Figure(data=go.Choropleth(
    locations = df['code'],
    z = df['risk'],
    text = df['COUNTRY'],
    colorscale = 'Rainbow',
    autocolorscale=False,
    reversescale=True,
    marker_line_color='darkgray',
    marker_line_width=0.5,
    colorbar_tickprefix = '',
    colorbar_title = 'Risk level',
))

fig.update_layout(
    title_text='Risk map',
    geo=dict(
        showframe=False,
        showcoastlines=False,
        projection_type='equirectangular'
    ),
    annotations = [dict(
        x=0.55,
        y=0.15,
        xref='paper',
        yref='paper',
        text='Source: <a href="www.google.com">\
            Google</a>',
        showarrow = False
    )]
)

fig.show()
Run Code Online (Sandbox Code Playgroud)

我的示例 df 是:

{'Country': {0: 'Afghanistan',
  1: 'Albania',
  2: 'Algeria',
  3: 'American Samoa',
  4: 'Andorra'},
 'code': {0: 'AFG', 1: 'ALB', 2: 'DZA', …
Run Code Online (Sandbox Code Playgroud)

python gis mapping plotly geopandas

6
推荐指数
1
解决办法
2358
查看次数

获取 GeoPandas 中两点之间的距离

我有两点如下。我需要以米为单位获得它们之间的距离。

POINT (80.99456 7.86795)
POINT (80.97454 7.872174)
Run Code Online (Sandbox Code Playgroud)

如何通过 GeoPandas 做到这一点?

distance geopandas

6
推荐指数
1
解决办法
6087
查看次数

将 Geopandas 数据框直接导出到压缩的 shapefile

我正在尝试将 Geopandas 数据框保存到直接写入压缩文件夹的 shapefile 中。

任何 shapefile 用户都知道,shapefile 不是单个文件,而是旨在一起读取的文件集合。所以呼吁 myGDF.to_file(filename='myshapefile.shp', driver='ESRI Shapefile')不仅创造myshapefile.shp而且myshapefile.prjmyshapefile.dbfmyshapefile.shxmyshapefile.cpg。这可能就是我努力在这里获得语法的原因。

例如,考虑一个虚拟的 Geopandas 数据框,例如:

import pandas as pd
import geopandas as gpd
from shapely.geometry import Point

data = pd.DataFrame({'name': ['a', 'b', 'c'],
    'property': ['foo', 'bar', 'foo'],
        'x': [173994.1578792833, 173974.1578792833, 173910.1578792833],
        'y': [444135.6032947102, 444186.6032947102, 444111.6032947102]})
geometry = [Point(xy) for xy in zip(data['x'], data['y'])]
myGDF = gpd.GeoDataFrame(data, geometry=geometry)
Run Code Online (Sandbox Code Playgroud)

我看到人们使用gzip,所以我尝试:

import geopandas as gpd
myGDF.to_file(filename='myshapefile.shp.gz', driver='ESRI Shapefile',compression='gzip')
Run Code Online (Sandbox Code Playgroud)

但它没有用。

然后我尝试了以下操作(在 …

python shapefile zipfile geopandas

6
推荐指数
2
解决办法
576
查看次数

Plotly choropleth_mapbox 的 GeoJSON 问题

我通过创建 choropleth 地图的方法plotly似乎非常简单——加载到 DataFrame 中,加载到 geojson 中,将必要的特征分配给自定义多边形,然后绘制。

显然,在引用自定义多边形时在某处遗漏了一个步骤,因为在漫长的加载时间后只会出现一张空白地图。

需要注意的一件主要事情是,大约一半的多边形位于州内,但它们是州内的自定义多边形。因此,据我所知,choropleth_mapbox是更合适的解决方案。

图像示例,显示各州内的自定义多边形: 在此处输入图片说明

编码:

import pandas as pd
import plotly.express as px
import geopandas as gpd
from geojson import Polygon
import json

# reading in the dataframe
path = '/path/to/csv'
df = pd.read_csv(path)
geo_df = gpd.GeoDataFrame(df)

# reading in the geospatial data
with open('/path/to/geojson') as f:
    geojson = json.load(f)
    
# create the plot
fig = px.choropleth_mapbox(geo_df[0:50], #slicing for quick loading
                           geojson=geojson, 
                           color="MALL",
                           locations="MWS_ID", 
                           featureidkey="properties.MWS_ID",
                           center={"lat": 39, 
                                   "lon": …
Run Code Online (Sandbox Code Playgroud)

python pandas plotly geopandas

6
推荐指数
1
解决办法
450
查看次数