পাইথনের সাথে জিওজেএসন তৈরি করা হচ্ছে


16

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

এটি সহজেই কোনও শেফফিলের জন্য করা হয়:

def create_data_dayer(self,varlist, data):
    """
    Creates a new shape to contain data about nodes.
    varlist is the list of fields names associated with
    the nodes.
    data is a list of lists whose first element is the geocode
    and the remaining elements are values of the fields, in the
    same order as they appear in varlist.
    """
    if os.path.exists(os.path.join(self.outdir,'Data.shp')):
        os.remove(os.path.join(self.outdir,'Data.shp'))
        os.remove(os.path.join(self.outdir,'Data.shx'))
        os.remove(os.path.join(self.outdir,'Data.dbf'))
    # Creates a new shape file to hold the data
    if not self.datasource:
        dsd = self.driver.CreateDataSource(os.path.join(self.outdir,'Data.shp'))
        self.datasource = dsd
        dl = dsd.CreateLayer("sim_results",geom_type=ogr.wkbPolygon)
    #Create the fields
    fi1 = ogr.FieldDefn("geocode",field_type=ogr.OFTInteger)
    dl.CreateField(fi1)
    for v in varlist:
        #print "creating data fields"
        fi = ogr.FieldDefn(v,field_type=ogr.OFTString)
        fi.SetPrecision(12)
        dl.CreateField(fi)

    #Add the features (points)
    for n,l in enumerate(data):
        #Iterate over the lines of the data matrix.
        gc = l[0]
        try:
            geom = self.geomdict[gc]
            if geom.GetGeometryType() != 3: continue
            #print geom.GetGeometryCount()
            fe = ogr.Feature(dl.GetLayerDefn())
            fe.SetField('geocode',gc)
            for v,d in zip (varlist,l[1:]):
                #print v,d
                fe.SetField(v,str(d))
            #Add the geometry
            #print "cloning geometry"
            clone = geom.Clone()
            #print geom
            #print "setting geometry"
            fe.SetGeometry(clone)
            #print "creating geom"
            dl.CreateFeature(fe)
        except: #Geocode not in polygon dictionary
            pass
        dl.SyncToDisk()

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

উপরের মতো উত্পন্ন বৈশিষ্ট্য সংগ্রহ কীভাবে রফতানি করবেন?

উত্তর:


14

আনন্দের OGR উভয় হিসাবে আপনার জন্য এটা করতে পারেন ogr.Featureএবং ogr.Geometryবস্তু আছে ExportToJson()পদ্ধতি। আপনার কোডে;

fe.ExportToJson()

যেহেতু GeoJSON FeatureCollection বস্তু কেবল অভিধান একজন সঙ্গে typeএর FeatureCollectionএকটি featuresবৈশিষ্ট্য বস্তুর একটি তালিকা ধারণকারী অবজেক্ট।

feature_collection = {"type": "FeatureCollection",
                      "features": []
                      }

feature_collection["features"].append(fe.ExportToJson())

বৈশিষ্ট্য সংগ্রহের সিআরএস বস্তু দুটি ধরণের একটি হতে পারে:

  • একটি নামী সিআরএস (উদাঃ একটি ওজিসি ইউআরএন বা একটি ইপিএসজি কোড)
  • ইউআরআই সহ একটি লিঙ্ক অবজেক্ট এবং "প্রজ 4" এর মতো একটি প্রকার

আপনার ডেটা ফর্ম্যাটের উপর নির্ভর করে এই নামটি সম্ভবত ওজিআর থেকে পেতে ব্যথা হতে চলেছে। পরিবর্তে আমরা যদি ডিস্কের কোনও ফাইলে প্রজেকশনটি লিখি যা আমরা ইউআরআইয়ের সাথে উল্লেখ করতে পারি। আমরা লেয়ার অবজেক্ট থেকে প্রজেকশনটি ধরতে পারি (যার বেশ কয়েকটি এক্সপোর্ট ফাংশন রয়েছে)

spatial_reference = dl.GetSpatialRef()

with open("data.crs", "wb") as f:
    f.write(spatial_reference.ExportToProj4())

feature_collection["crs"] = {"type": "link",
                             "properties": {
                                 "href": "data.crs",
                                 "type": "proj4"
                                 }
                             }

এটি একটি ভাল সমাধান, কারণ এটি @sgillies (সুন্দর) সমাধানের মতো আমার প্রকল্পে কোনও অতিরিক্ত নির্ভরতা যুক্ত করে না
fccoelho

আমি এই সমাধানটি দিয়ে আমার পরীক্ষা শেষ করেছি এবং এটি দুর্দান্তভাবে কাজ করেছে। তবে ক্ষেত্রের নামগুলিতে বৈশিষ্ট্যগুলির ইউনিকোড অক্ষরগুলি থাকাকালীন আমাকে নিজেই হ্যান্ডেল করতে হয়েছিল, কারণ ogr.py সেগুলি সঠিকভাবে পরিচালনা করে না handle
fccoelho

আমি জানি না যে থেকে কার্যকারিতা পরিবর্তিত হয়েছে কিনা, তবে fe.ExportToJson()একটি স্ট্রিং প্রদান করে, তাই আপনার সাথে মোড়ানো দরকার json.loads(...)। অন্যথায়, এটি সুপার সহায়ক!
jon_two

35

যদি আপনি একটি জিডিএল / ওজিআর ডেভ এনভায়রনমেন্ট (শিরোনাম, লিবস) পেয়ে থাকেন তবে আপনি ফিয়োনা ব্যবহার করে আপনার কোডটি মূলত সহজ করতে পারেন । শেফফাইল থেকে বৈশিষ্ট্যগুলি পড়তে, নতুন বৈশিষ্ট্য যুক্ত করুন, এবং এগুলি লিখিতভাবে জিওজেএসন হ'ল মুষ্টিমেয় লাইন:

import fiona
import json

features = []
crs = None
with fiona.collection("docs/data/test_uk.shp", "r") as source:
    for feat in source:
        feat['properties'].update(...) # with your attributes
        features.append(feat)
    crs = " ".join("+%s=%s" % (k,v) for k,v in source.crs.items())

my_layer = {
    "type": "FeatureCollection",
    "features": features,
    "crs": {
        "type": "link", 
        "properties": {"href": "my_layer.crs", "type": "proj4"} }}

with open("my_layer.json", "w") as f:
    f.write(json.dumps(my_layer))
with open("my_layer.crs", "w") as f:
    f.write(crs)

4
ফিওনা ডক্স হত্যাকারী!
চাদ কুপার

1
আমি যদি একাধিকবার ভোট দিতাম!
ওমেনার্স

2
জিওজেএসনে সিআর সংজ্ঞা অন্তর্ভুক্ত করার কোনও উপায় নেই?
fccoelho

2

এটি ফিয়োনার মধ্যে সবচেয়ে সহজ এবং সহজ। আপনি জিওজেএসন আউটপুট জন্য এসআরএস সেট করতে পারেন।

import fiona
from fiona.crs import from_epsg

source= fiona.open('shp/second_shp.shp', 'r', encoding = 'utf-8')

with fiona.open('tool_shp_geojson/geojson_fiona.json','w',  driver ="GeoJSON", schema=source.schema, encoding = 'utf-8', crs=fiona.crs.from_epsg(4326)) as geojson:
     geojson.write(feat)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.