জিওপ্যান্ডে কাঁচা তথ্য পড়া


14

geopandas GeoDataFrame, লা লা এ-তে কাঁচা তথ্য পড়া কি সম্ভব 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))

এবং ফিওনা ১. 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())

এটি জিওজেসনের পক্ষে কাজ করে, যা প্রশ্নের উত্তর দেয়। তবে এটি অন্য ভূ-স্থান সংক্রান্ত ফাইল ফর্ম্যাটগুলির জন্য যেমন শেফফিলস বা কেএমএল বা কেএমজেডের মতো কাজ করবে না। আপনি কি এই ক্ষেত্রে একটি workaround সম্পর্কে জানেন?
আলেক্সি বিলোগুর

একটু স্পষ্টতা অর্ডার হয়। জিওপান্ডাস এবং ফিয়োনা শেফফিল এবং কেএমএল সমর্থন করে তবে তারা নিউইয়র্কের সিটির মতো একটি বন্ধ এপিআই সমর্থন করতে পারে না। এছাড়াও, BytesCollectionসম্পূর্ণরূপে কাজ করে তবে github.com/Toblerity/Fiona/issues/409 এ বিকল্পগুলির মধ্যে একটির পক্ষে ভবিষ্যতের সংস্করণে সম্ভবত মুছে ফেলা হতে চলেছে
সাগিলিজ

ধন্যবাদ। @ সিসিলিগুলিকে এটিকে বৈশিষ্ট্যটির অনুরোধ হিসাবে খোলা উচিত geopandas, না আপনি এখানে উল্লিখিত পরিবর্তনগুলির জন্য অপেক্ষা করা ভাল ?
আলেক্সি বিলোগুর

@ সিসিলিগুলি আপনি বলেছেন যে ফিওনা উপরের আপনার মন্তব্যে কেএমএল সমর্থন করে, তবে DriverError: unsupported driver: 'KML'কেএমএল খোলার চেষ্টা করার সময় উত্থাপিত হয় কারণ এটি supported_driversডিকটিতে নেই (ফিয়োনা ১.১.১ ব্যবহার করে) এবং আমি কয়েকটি বিষয় পুনরায় লক্ষ্য করেছি। কেএমএল সহায়তার অভাব (# 23 এবং # 97)। ফিওনা কি কেএমএলকে সমর্থন করে?
ব্যবহারকারী2856

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

দুর্ভাগ্যজনক যে এটি কাজ করে না। আল্টায়ার চোরোপলথ প্লটগুলির জন্য আমি গিটহাবের উপর আপনার উদাহরণ অনুসরণ করার চেষ্টা করছিলাম কিন্তু এটিও একই একই ত্রুটিটিকে লাইনে ফেলে দেয় gdf = gpd.read_file(counties, driver='TopoJSON')। আমি ভেবেছিলাম ব্যবহারের ফলে with fiona.Collection...কাজ হতে পারে তবে দুঃখের সাথে তা হয় না।
এডেজ

@ এডেজ এটি একটি বাগ ছিল এবং ফিওনা ১.৮.৫ এ ঠিক করা হবে, দেখুন: github.com/Toblerity/Fiona/issues/721
মাত্তিজন


2

ফিওনা ১.৮ ব্যবহার করার সময়, এটি (অবশ্যই?) প্রকল্পের 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

সবচেয়ে সহজ উপায় হ'ল জিওএসএসএন ইউআরএলকে সরাসরি জিপিডি.ড্রেড () এ ইনপুট করা। আমি এর আগে বাইটসআইও ও জিপফিল ব্যবহার করে জিপ থেকে একটি শেপফাইল বের করার চেষ্টা করেছি এবং জিপিডি (বিশেষত ফিওনা) ফাইল-জাতীয় অবজেক্ট গ্রহণ করার ক্ষেত্রে সমস্যা ছিল।

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()জিওএফএস কনস্ট্রাক্টরকে সরাসরি জিওএফএস কনস্ট্রাক্টরকে পাস করার চেয়ে অননুমোদিত ব্যবহার করে প্রাপ্ত ফলাফলটিকে পছন্দ করি:

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

ফলস্বরূপ জিওডাটাফ্রেমে জ্যামিতি কলামটি সঠিকভাবে সেট করা আছে এবং সমস্ত কলামগুলি যেমনটি আমি প্রত্যাশা করব, কোনও বৈশিষ্ট্য সংকলনের প্রয়োজন ছাড়াই

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.