भूगर्भ में कच्चे डेटा को पढ़ना


14

क्या कच्चे डेटा को a geopandas GeoDataFrame, la a में पढ़ना संभव है pandas DataFrame?

उदाहरण के लिए, निम्नलिखित कार्य:

import pandas as pd
import requests
data = requests.get("https://data.cityofnewyork.us/api/geospatial/arq3-7z49?method=export&format=GeoJSON")
pd.read_json(io.BytesIO(r.content))

निम्नलिखित नहीं है:

import geopandas as gpd
import requests
data = requests.get("https://data.cityofnewyork.us/api/geospatial/arq3-7z49?method=export&format=GeoJSON")
gpd.read_file(io.BytesIO(r.content))

दूसरे शब्दों में, क्या यह संभव है कि जियोस्पेशियल डेटा को पहले पढ़ने के लिए उस डेटा को डिस्क में सहेजे बिना मेमोरी में पढ़ा जाए?

जवाबों:


16

आप सीधे जियोडाटाफ्रेम कंस्ट्रक्टर को जसन पास कर सकते हैं:

import geopandas as gpd
import requests
data = requests.get("https://data.cityofnewyork.us/api/geospatial/arq3-7z49?method=export&format=GeoJSON")
gdf = gpd.GeoDataFrame(data.json())
gdf.head()

आउटपुट:

                                            features               type
0  {'type': 'Feature', 'geometry': {'type': 'Poin...  FeatureCollection
1  {'type': 'Feature', 'geometry': {'type': 'Poin...  FeatureCollection
2  {'type': 'Feature', 'geometry': {'type': 'Poin...  FeatureCollection
3  {'type': 'Feature', 'geometry': {'type': 'Poin...  FeatureCollection
4  {'type': 'Feature', 'geometry': {'type': 'Poin...  FeatureCollection

समर्थित सिंगल-फाइल फॉर्मेट या ज़िप्ड शेपफाइल्स के लिए, आप उपयोग कर सकते हैं fiona.BytesCollectionऔर GeoDataFrame.from_features:

import requests
import fiona
import geopandas as gpd

url = 'http://www.geopackage.org/data/gdal_sample.gpkg'
request = requests.get(url)
b = bytes(request.content)
with fiona.BytesCollection(b) as f:
    crs = f.crs
    gdf = gpd.GeoDataFrame.from_features(f, crs=crs)
    print(gdf.head())
और ज़िप्ड शेपफाइल्स के लिए ( फियोना 1.7.2 के रूप में समर्थित )
url = 'https://www2.census.gov/geo/tiger/TIGER2010/STATE/2010/tl_2010_31_state10.zip'
request = requests.get(url)
b = bytes(request.content)
with fiona.BytesCollection(b) as f:
    crs = f.crs
    gdf = gpd.GeoDataFrame.from_features(f, crs=crs)
    print(gdf.head())

आप यह जान सकते हैं कि फियोना किन स्वरूपों का समर्थन करता है जैसे कि:

import fiona
for name, access in fiona.supported_drivers.items():
    print('{}: {}'.format(name, access))

और fiona 1.7.1 या उससे पहले के इन-मेमोरी जिप्ड डेटा को पढ़ने के लिए एक हैकी वर्कअराउंड:

import requests
import uuid
import fiona
import geopandas as gpd
from osgeo import gdal

request = requests.get('https://github.com/OSGeo/gdal/blob/trunk/autotest/ogr/data/poly.zip?raw=true')
vsiz = '/vsimem/{}.zip'.format(uuid.uuid4().hex) #gdal/ogr requires a .zip extension

gdal.FileFromMemBuffer(vsiz,bytes(request.content))
with fiona.Collection(vsiz, vsi='zip', layer ='poly') as f:
    gdf = gpd.GeoDataFrame.from_features(f, crs=f.crs)
    print(gdf.head())

यह GeoJSON के लिए काम करता है, जो सवाल का जवाब देता है। लेकिन यह अन्य भू-स्थानिक फ़ाइल स्वरूपों के लिए काम नहीं करेगा, जैसे शेपफाइल्स या केएमएल या केएमजेड। क्या आप उन मामलों के लिए समाधान के बारे में जानते हैं?
अलेक्सी बिलोगुर

थोड़ा स्पष्टीकरण क्रम में है। जियो पांडस और फियोना शेपफाइल्स और केएमएल का समर्थन करते हैं, लेकिन वे न्यूयॉर्क के सिटी जैसे एपीआई से पूरी तरह से समर्थन नहीं कर सकते। इसके अलावा, BytesCollectionपूरी तरह से काम करता है, लेकिन शायद भविष्य के संस्करण में github.com/Toblerity/Fiona/issues/409 में से एक के पक्ष में हटा दिया जाएगा ।
sgillies

धन्यवाद। @sgillies को एक सुविधा अनुरोध के रूप में खोला जाना चाहिए geopandas, या आपके द्वारा यहां उल्लिखित परिवर्तनों की प्रतीक्षा करना बेहतर होगा ?
अलेक्सी बिलोगुर

@sgillies आप बताती हैं कि फियोना ऊपर आपकी टिप्पणी में केएमएल का समर्थन करती है, लेकिन DriverError: unsupported driver: 'KML'केएमएल को खोलने का प्रयास करते समय उठाया जाता है क्योंकि यह तानाशाही में नहीं है supported_drivers(फियोना 1.7.1 का उपयोग करके) और मैंने फिर से कुछ मुद्दों पर ध्यान दिया। केएमएल समर्थन की कमी (# 23 और # 97)। क्या Fiona KML का समर्थन करता है?
user2856

from_featuresविधि को स्पॉट करने के लिए धन्यवाद । मेरा दिन बचाया!
jlandercy

3

चूंकि यहां समाधान के fiona.BytesCollectionलिए काम करने की जरूरत नहीं है, TopoJSONजो सभी की आवश्यकता के बिना काम करता है gdal:

import fiona
import geopandas as gpd
import requests

# parse the topojson file into memory
request = requests.get('https://vega.github.io/vega-datasets/data/us-10m.json')
visz = fiona.ogrext.buffer_to_virtual_file(bytes(request.content))

# read the features from a fiona collection into a GeoDataFrame
with fiona.Collection(visz, driver='TopoJSON') as f:
    gdf = gpd.GeoDataFrame.from_features(f, crs=f.crs)

के साथ geopandas==0.4.0, Fiona==1.8.4और पायथन 3, मुझे मिलता है DriverError: unsupported driver: 'TopoJSON'
एडीज

तुम सही हो। यह कम से कम संस्करण तक काम कर रहा था 1.7.13कीFiona
Mattijn

यह दुर्भाग्यपूर्ण है कि यह काम नहीं करता है। मैं आपके उदाहरण के लिए Altair choropleth भूखंडों के लिए GitHub पर अनुसरण करने की कोशिश कर रहा था, लेकिन वह भी लाइन में ठीक उसी त्रुटि को फेंकता है gdf = gpd.read_file(counties, driver='TopoJSON')। मैंने सोचा था कि उपयोग with fiona.Collection...करने से काम हो सकता है लेकिन दुख की बात है कि यह नहीं है।
1919

@edesz यह एक बग था और फियोना 1.8.5 में तय किया जाएगा, देखें: github.com/Toblerity/Fiona/issues/721
मैटीजेन


2

फियोना 1.8 का उपयोग कर, यह कर सकते हैं (चाहिए?) का उपयोग कर कि इस परियोजना के लिए किया जाना MemoryFileयाZipMemoryFile

उदाहरण के लिए:

import fiona.io
import geopandas as gpd
import requests

response = requests.get('http://example.com/Some_shapefile.zip')
data_bytes = response.content

with fiona.io.ZipMemoryFile(data_bytes) as zip_memory_file:
    with zip_memory_file.open('Some_shapefile.shp') as collection:
      geodf = gpd.GeoDataFrame.from_features(collection, crs=collection.crs)

0

सबसे आसान तरीका है कि सीधे जेजोन यूआरएल को gpd.read () में इनपुट करें। मैंने बाइट्सियो और जिपफाइल का उपयोग करने से पहले एक ज़िप से एक शेपफाइल निकालने की कोशिश की थी और फ़ाइल-जैसी वस्तुओं को स्वीकार करते हुए जीपीडी (विशेष रूप से फियोना) के साथ समस्या थी।

import geopandas as gpd
import David.SQL_pull_by_placename as sql
import os

os.environ['PROJ_LIB'] = r'C:\Users\littlexsparkee\Anaconda3\Library\share\proj'

geojson_url = f'https://github.com/loganpowell/census-geojson/blob/master/GeoJSON/500k/2018/{sql.state}/block-group.json?raw=true'
census_tracts_gdf = gpd.read_file(geojson_url)

0

मैं GeoDataFrame.from_features()GDF कंस्ट्रक्टर को सीधे GeoJSON को पारित करने के बजाय अनिर्दिष्ट का उपयोग करके प्राप्त परिणाम पसंद करता हूं :

import geopandas as gpd
import requests
data = requests.get("https://data.cityofnewyork.us/api/geospatial/arq3-7z49?method=export&format=GeoJSON")
gpd.GeoDataFrame().from_features(data.json())

उत्पादन

                       geometry                         name                                url           line objectid                                              notes
0    POINT (-73.99107 40.73005)                     Astor Pl  http://web.mta.info/nyct/service/  4-6-6 Express        1  4 nights, 6-all times, 6 Express-weekdays AM s...
1    POINT (-74.00019 40.71880)                     Canal St  http://web.mta.info/nyct/service/  4-6-6 Express        2  4 nights, 6-all times, 6 Express-weekdays AM s...
2    POINT (-73.98385 40.76173)                      50th St  http://web.mta.info/nyct/service/            1-2        3                              1-all times, 2-nights
3    POINT (-73.97500 40.68086)                    Bergen St  http://web.mta.info/nyct/service/          2-3-4        4           4-nights, 3-all other times, 2-all times
4    POINT (-73.89489 40.66471)             Pennsylvania Ave  http://web.mta.info/nyct/service/            3-4        5                        4-nights, 3-all other times

परिणामी GeoDataFrame में ज्यामिति स्तंभ सही ढंग से सेट है और सभी कॉलम, जैसा कि मैं चाहता हूँ, बिना किसी भी सुविधा के अनावश्यक होने की आवश्यकता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.