পাইথনের গুণাবলীর উপর ভিত্তি করে বহুভুজগুলি দ্রবীভূত করে (রূপক, ফিয়োনা)?


15

আমি একটি ফাংশন তৈরি করার চেষ্টা করছি যা কিউজিআইএস ফাংশনটি "দ্রবীভূত" করে মূলত একই কাজ করে। আমি ভেবেছিলাম এটি খুব সহজ হবে তবে দৃশ্যত তা ভাল নয়। সুতরাং আমি যা চারপাশে জড়ো করেছি, সেখান থেকে ফায়োনার ব্যবহার সুন্দরভাবে করা উচিত। আমি সবেমাত্র ভেক্টর ফাইলগুলির সাথে জগাখিচুড়ি শুরু করেছিলাম তাই এই পৃথিবীটি আমার কাছেও অজানা এবং অজগরটিও বেশ নতুন।

এই উদাহরণের জন্য, আমি এখানে প্রতিষ্ঠিত একটি কাউন্টি শেফফিলের সাথে কাজ করছি http://tinyurl.com/odfbanu সুতরাং আমি এখানে কিছু সংখ্যক কোড সংগ্রহ করেছি তবে তাদের একসাথে কাজ করার কোনও উপায় খুঁজে পাচ্ছি না

: এখন আমার সবচেয়ে ভালো পদ্ধতি উপর ভিত্তি করে নিম্নোক্ত https://sgillies.net/2009/01/27/a-more-perfect-union-continued.html । এটি সূক্ষ্মভাবে কাজ করে এবং আমি শেপলি জ্যামিতি হিসাবে 52 টি রাজ্যের একটি তালিকা পাই। এই অংশটি করার আরও সহজ সরল কোনও উপায় থাকলে দয়া করে বিনা দ্বিধায় মন্তব্য করুন।

from osgeo import ogr
from shapely.wkb import loads
from numpy import asarray
from shapely.ops import cascaded_union

ds = ogr.Open('counties.shp')
layer = ds.GetLayer(0)

#create a list of unique states identifier to be able
#to loop through them later
STATEFP_list = []
for i in range(0 , layer.GetFeatureCount()) :
    feature = layer.GetFeature(i)
    statefp = feature.GetField('STATEFP')
    STATEFP_list.append(statefp)

STATEFP_list = set(STATEFP_list)

#Create a list of merged polygons = states 
#to be written to file
polygons = []

#do the actual dissolving based on STATEFP
#and append polygons
for i in STATEFP_list : 
    county_to_merge = []
    layer.SetAttributeFilter("STATEFP = '%s'" %i ) 
    #I am not too sure why "while 1" but it works 
    while 1:
        f = layer.GetNextFeature()
        if f is None: break
        g = f.geometry()
        county_to_merge.append(loads(g.ExportToWkb()))

    u = cascaded_union(county_to_merge)
    polygons.append(u)

#And now I am totally stuck, I have no idea how to write 
#this list of shapely geometry into a shapefile using the
#same properties that my source.

সুতরাং লেখাটি যা আমি দেখেছি তা থেকে সরাসরি এগিয়ে যায় না, আমি কেবল একই রকম শেফফিলিটি কেবলমাত্র দেশগুলিকে রাজ্যগুলিতে বিভক্ত করতে চাই, আমার এমনকি অ্যাট্রিবিউট টেবিলের খুব বেশি প্রয়োজনও নেই তবে আপনি কীভাবে পাশ করতে পারেন তা দেখার জন্য আমি আগ্রহী এটি উত্স থেকে নতুন তৈরি শেফফিল পর্যন্ত।

ফিয়োনার সাথে লেখার জন্য অনেকগুলি কোডের সন্ধান পেয়েছি তবে আমি কখনই এটি আমার ডেটা দিয়ে কাজ করতে সক্ষম হই না। শেপফাইলে শেপলি জ্যামিতি কীভাবে লিখবেন তা থেকে উদাহরণ ? :

from shapely.geometry import mapping, Polygon
import fiona

# Here's an example Shapely geometry
poly = Polygon([(0, 0), (0, 1), (1, 1), (0, 0)])

# Define a polygon feature geometry with one attribute
schema = {
    'geometry': 'Polygon',
    'properties': {'id': 'int'},
}

# Write a new Shapefile
with fiona.open('my_shp2.shp', 'w', 'ESRI Shapefile', schema) as c:
    ## If there are multiple geometries, put the "for" loop here
    c.write({
        'geometry': mapping(poly),
        'properties': {'id': 123},
    })

এখানে সমস্যা হ'ল জ্যামিতির তালিকার সাথে কীভাবে করা যায় এবং উত্সের চেয়ে একই বৈশিষ্ট্যগুলি কীভাবে পুনরায় তৈরি করা যায়।

উত্তর:


22

প্রশ্ন Fiona, এবং সুষম সম্পর্কে এবং GeoPandas ব্যবহার করে অন্যান্য উত্তর জানতে প্রয়োজন পান্ডাস । তাছাড়া জিওপ্যান্ডাস শেওফাইলগুলি পড়তে / লেখতে ফিয়োনা ব্যবহার করে।

আমি এখানে জিওপান্ডাসের ইউটিলিটিটি নিয়ে প্রশ্ন তুলছি না, তবে আপনি স্টোন স্ট্যান্ডার্ড মডিউল ইরটোলগুলি ব্যবহার করে সরাসরি এটি করতে পারবেন , বিশেষত কমান্ড গ্রুপবাইয়ের সাহায্যে ("সংক্ষেপে, গ্রুপবাই একটি পুনরুক্তি নেয় এবং পরিবর্তনের উপর ভিত্তি করে এটি সাব-ইটারেটারে বিভক্ত হয়) মূল পুনরাবৃত্তির "কী" তে। এটি অবশ্যই পুরো উত্স পুনরাবৃত্তিকে মেমরির মধ্যে না পড়েই সম্পন্ন করা হবে ", itertools.groupby )।

স্টেটএফপি ফিল্ড দ্বারা রঙিন মূল আসল ile

এখানে চিত্র বর্ণনা লিখুন

from shapely.geometry import shape, mapping
from shapely.ops import unary_union
import fiona
import itertools
with fiona.open('cb_2013_us_county_20m.shp') as input:
    # preserve the schema of the original shapefile, including the crs
    meta = input.meta
    with fiona.open('dissolve.shp', 'w', **meta) as output:
        # groupby clusters consecutive elements of an iterable which have the same key so you must first sort the features by the 'STATEFP' field
        e = sorted(input, key=lambda k: k['properties']['STATEFP'])
        # group by the 'STATEFP' field 
        for key, group in itertools.groupby(e, key=lambda x:x['properties']['STATEFP']):
            properties, geom = zip(*[(feature['properties'],shape(feature['geometry'])) for feature in group])
            # write the feature, computing the unary_union of the elements in the group with the properties of the first element in the group
            output.write({'geometry': mapping(unary_union(geom)), 'properties': properties[0]})

ফলাফল

এখানে চিত্র বর্ণনা লিখুন


খুব সুন্দর একটি, উভয়ের মধ্যে পছন্দ করা শক্ত। বিভিন্ন পদ্ধতি দেখে ভাল লাগল ধন্যবাদ!
ব্যবহারকারী 18981898198119

11

বৈশিষ্ট্যগুলির বৃহত ভাণ্ডারগুলির সাথে কাজ করার জন্য এবং বাল্ক অপারেশন করার জন্য আমি জিওপ্যান্ডাসকে উচ্চতর প্রস্তাব দিই।

এটি পান্ডাস ডেটা ফ্রেমগুলি প্রসারিত করে এবং হুডের নীচে সুদৃশ্য ব্যবহার করে।

from geopandas import GeoSeries, GeoDataFrame

# define your directories and file names
dir_input = '/path/to/your/file/'
name_in = 'cb_2013_us_county_20m.shp'
dir_output = '/path/to/your/file/'
name_out = 'states.shp'

# create a dictionary
states = {}
# open your file with geopandas
counties = GeoDataFrame.from_file(dir_input + name_in)

for i in range(len(counties)):
    state_id = counties.at[i, 'STATEFP']
    county_geometry = counties.at[i, 'geometry']
    # if the feature's state doesn't yet exist, create it and assign a list
    if state_id not in states:
        states[state_id] = []
    # append the feature to the list of features
    states[state_id].append(county_geometry)

# create a geopandas geodataframe, with columns for state and geometry
states_dissolved = GeoDataFrame(columns=['state', 'geometry'], crs=counties.crs)

# iterate your dictionary
for state, county_list in states.items():
    # create a geoseries from the list of features
    geometry = GeoSeries(county_list)
    # use unary_union to join them, thus returning polygon or multi-polygon
    geometry = geometry.unary_union
    # set your state and geometry values
    states_dissolved.set_value(state, 'state', state)
    states_dissolved.set_value(state, 'geometry', geometry)

# save to file
states_dissolved.to_file(dir_output + name_out, driver="ESRI Shapefile")

এটি আমার হ্যাকি অদ্ভুত জিনিসটির চেয়ে আরও মার্জিত। ধন্যবাদ! স্থানিক রেফারেন্স সিস্টেমে যাওয়ার কোনও উপায় আছে কি?
ব্যবহারকারী 18981898198119

উত্স ফাইল থেকে নতুন ফাইলে কীভাবে সিআরএস স্থানান্তর করতে হয় তা দেখানোর জন্য আমি আমার পোস্টটি সম্পাদনা করেছি। রাজ্যগুলি-বিযুক্ত জিওডাটা ফ্রেম তৈরি করা হয়েছে এমন লাইনে এটি ঘটে। স্কিমা সম্পর্কিত, আমি কেবল একটি ম্যানুয়ালি তৈরি করার পরামর্শ দেব (অর্থাত্ একই লাইনের কলামগুলির সম্পত্তি ব্যবহার করে) যা পরে নতুন ফাইলের বৈশিষ্ট্যে লেখা থাকে। যেমন আপনি যখন আপনার রাজ্য অভিধান তৈরি করেন, ঠিক তেমন অন্য কোনও বৈশিষ্ট্য যুক্ত করুন এবং সেগুলি নতুন ডেটা ফ্রেমের কলামে বরাদ্দ করুন।
গীতোলো

0

@ জিনের উত্তরের সংযোজন হিসাবে , আমার একাধিক ক্ষেত্র দ্বারা দ্রবীভূত হওয়া দরকার তাই একাধিক ক্ষেত্রগুলি পরিচালনা করতে তার কোডটি সংশোধন করা উচিত। নীচের কোডটি operator.itemgetterএকাধিক ক্ষেত্র দ্বারা গ্রুপ করতে ব্যবহার করে:

# Modified from /gis//a/150001/2856
from shapely.geometry import shape, mapping
from shapely.ops import unary_union
import fiona
import itertools
from operator import itemgetter


def dissolve(input, output, fields):
    with fiona.open(input) as input:
        with fiona.open(output, 'w', **input.meta) as output:
            grouper = itemgetter(*fields)
            key = lambda k: grouper(k['properties'])
            for k, group in itertools.groupby(sorted(input, key=key), key):
                properties, geom = zip(*[(feature['properties'], shape(feature['geometry'])) for feature in group])
                output.write({'geometry': mapping(unary_union(geom)), 'properties': properties[0]})


if __name__ == '__main__':
    dissolve('input.shp', 'input_dissolved.shp', ["FIELD1", "FIELD2", "FIELDN"))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.