পয়েন্ট জোড়া থেকে লাইন তৈরি করে অর্কিপির সাথে সমন্বয় করে?


11

আমি কিছু পয়েন্ট জোড় স্থানাঙ্ক পেয়েছি (শুরু এবং শেষ পয়েন্ট) যা আমাকে লাইনে রূপান্তর করতে হবে। এখন অবধি, আমি ক উভয় স্থানাঙ্কের সংযোজন a pippo.Point(), pippo.CalculateGeometry()একটিতে প্রতিটি পিয়ানোটের জ্যামিতি সংজ্ঞায়িত করতে এবং pippo.append(defined geometry)পয়েন্টগুলির জোড় সনাক্ত করতে এবং তারপরে পয়েন্টসটোলাইন আমার লাইনটি ব্যবহার করেছি। কয়েকশ লাইনের জন্য এটি করা বেশ ব্যয়বহুল।

এটি করার একটি ছোট উপায় আছে?

উদাহরণস্বরূপ, একক টেবিলের বিভিন্ন ক্ষেত্রে প্রতিটি লাইনের প্রারম্ভিক এবং শেষের পয়েন্ট রাখুন এবং পয়েন্ট জ্যামিতির জন্য পাস না করে সরাসরি লাইন আমদানি করুন।

উত্তর:


8

এটি একটি সারণী পড়বে (এক্ষেত্রে এক্সেল শিট, তবে কোনও টেবিলের ধরণের হতে পারে) যা দেখতে দেখতে এমন:

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

এস_ এক্স হ'ল এক্স পয়েন্ট, ই_ এক্স শেষ এক্স পয়েন্ট, ওয়াই এর জন্য একই। আমরা ইনপুট টেবিলটি দিয়ে পুনরাবৃত্তি করব, তারপরে প্রতিটি সারির জন্য, শুরু / শেষ এক্স / ওয়াইসকে একটি বিন্দুতে সেট করুন, সেই বিন্দুকে একটি অ্যারে যুক্ত করুন, তারপরে দুটি পয়েন্টের অ্যারে থেকে একটি পললাইন তৈরি করুন। তারপরে ফিচারক্লাসে প্রবেশ করুন। পাখলান পুনরাবৃত্তি.

import arcpy

in_rows = arcpy.SearchCursor(r"D:\Temp\Lines.xls\Sheet1$")

point = arcpy.Point()
array = arcpy.Array()

featureList = []
cursor = arcpy.InsertCursor(r"D:\Temp\Lines.shp")
feat = cursor.newRow()

for in_row in in_rows:
    # Set X and Y for start and end points
    point.X = in_row.S_X
    point.Y = in_row.S_Y
    array.add(point)
    point.X = in_row.E_X
    point.Y = in_row.E_Y
    array.add(point)   
    # Create a Polyline object based on the array of points
    polyline = arcpy.Polyline(array)
    # Clear the array for future use
    array.removeAll()
    # Append to the list of Polyline objects
    featureList.append(polyline)
    # Insert the feature
    feat.shape = polyline
    cursor.insertRow(feat)
del feat
del cursor

এবং আপনি আপনার লাইন পান:

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


আপনাকে ধন্যবাদ, আমি আমার বিশ্লেষণের সময়কাল অনুমান করব এবং এটি করার চেষ্টা করছিলাম :-)
আনালিসা মেনেলি

এক্স লাইন পয়েন্টের জন্য। x = in_row.S_X এটি একটি ত্রুটি প্রদান করে বলেছিল যে ইনপুট মানটি সংখ্যাসূচক নয়। আমি এটি ইনট বা ভাসমান বা এমনকি সংখ্যাসূচক করার চেষ্টা করেছি তবে কাজ করে না কারণ ক্ষেত্রটি কোনও সংখ্যা ননটাইপ নয়। কোন সাহায্য?
ফেদেরিকো গমেজ

5

আমি গত সপ্তাহে একটি অজগর স্ক্রিপ্ট তৈরি করেছি (যদিও আরকিপি ব্যবহার করে নেই), এটি এমন পয়েন্টগুলি গ্রহণ করে যা বাস লাইনগুলির জ্যামিতি তৈরি করে (একটি পয়েন্ট shp) একটি ক্রমিক সংখ্যা ক্ষেত্র ("SEQ") অনুযায়ী according একই বৈশিষ্ট্যটির কোনও ক্ষেত্র থেকে জ্যামিতির পরিবর্তে ক্ষেত্রের মানটি ব্যবহার করতে আপনি সহজেই এটিটিকে টুইঙ্ক করতে পারেন।

# -*- coding: utf-8 -*-
###############################################################################
from sys import argv
import osgeo.ogr
import os, os.path
###############################################################################

script, srcSHP = argv

#-- Open source shapefile
shapefile = osgeo.ogr.Open(srcSHP)
layer = shapefile.GetLayer(0)
spatialRef = layer.GetSpatialRef()

#-- Output directory
outDir = os.path.dirname(srcSHP)
outDirName = os.path.basename(outDir)

driver = osgeo.ogr.GetDriverByName("ESRI Shapefile")
outFile = driver.CreateDataSource(os.path.join(outDir,outDirName + "_lines.shp"))
outLayer = outFile.CreateLayer("layer", spatialRef)

#-- Adding fields to the output shapefile
fieldDef = osgeo.ogr.FieldDefn("line_no", osgeo.ogr.OFTString)
fieldDef.SetWidth(12)
outLayer.CreateField(fieldDef)

fieldDef = osgeo.ogr.FieldDefn("From_SEQ", osgeo.ogr.OFTReal)
outLayer.CreateField(fieldDef)

fieldDef = osgeo.ogr.FieldDefn("To_SEQ", osgeo.ogr.OFTReal)
outLayer.CreateField(fieldDef)

#-- Going through each feature, one by one
#-- The last point is the end of the line so I don't want to iterate through that one
for i in range(layer.GetFeatureCount()-1):
    lString = osgeo.ogr.Geometry(osgeo.ogr.wkbLineString)  

    feature1 = layer.GetFeature(i)
    feature2 = layer.GetFeature(i+1)

    # When it's a new line, the sequential number restart to 1, so we don't want that line
    if feature1.GetField("SEQ") < feature2.GetField("SEQ"):
        geom1 = feature1.GetGeometryRef()
        geom2 = feature2.GetGeometryRef()

        geom1x = geom1.GetX()
        geom1y = geom1.GetY()
        geom2x = geom2.GetX()
        geom2y = geom2.GetY()

        lString.AddPoint(geom1x, geom1y)
        lString.AddPoint(geom2x, geom2y)     # Adding the destination point

        #-- Adding the information from the source file to the output
        feat = osgeo.ogr.Feature(outLayer.GetLayerDefn())
        feat.SetGeometry(lString)
        feat.SetField("line_no", feature1.GetField("line_no"))
        feat.SetField("From_SEQ", feature1.GetField("SEQ"))
        feat.SetField("To_SEQ", feature2.GetField("SEQ"))
        outLayer.CreateFeature(feat)

print "The End"

প্রতিটি জোড় বিন্দু একক লাইন তৈরি করবে। এটি করার জন্য আরও মার্জিত উপায় হতে পারে, তবে এটি প্রায় 15 সেকেন্ডের মধ্যে 3900 লাইন তৈরি করেছে যাতে এটি আমার পক্ষে কাজ করে ...


ধন্যবাদ, দেখতে হুবহু বিস্তৃত আকারের মতো .. এটি আমার পক্ষে সত্যই কার্যকর হওয়া উচিত। আমি চেষ্টা করব এবং তারপরে প্রতিক্রিয়া জানাব। আপাতত ধন্যবাদ
আনালিসা মেনেলি

3

আপনি এই দুটি সরঞ্জাম এক্সওয়াই ইভেন্ট স্তর এবং পয়েন্টগুলিকে লাইনে পরিণত করতে পারেন , পয়েন্টগুলিতে লাইনের প্যারামিটারগুলি দেখে (লাইন ক্ষেত্র, সাজান পয়েন্ট) এবং ইনপুট টেবিলের ডেটা আপডেট করে, কাজটি সহজ হতে পারে


1

এটি @ চ্যাডকুপারের উত্তরের একটি আপডেট মাত্র, কারণ "দা" কার্সারগুলি এখন সুবিধাজনকভাবে পূর্ববর্তী কার্সারগুলি প্রতিস্থাপন করছে:

with arcpy.da.SearchCursor(input_table,[orig_namefield,x1,y1,x2,y2] ) as in_rows:
    with arcpy.da.InsertCursor(output_lines,["SHAPE@",name_field]) as cursor:
        for row in in_rows:
            # build array for line segment
            array = arcpy.Array([arcpy.Point(row[1],row[2]),arcpy.Point(row[3],row[4])])
            # Create a Polyline object based on the array of points
            polyline = arcpy.Polyline(array)
            # Insert the feature
            cursor.insertRow([polyline,row[0]])
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.