码迷,mamicode.com
首页 > 其他好文 > 详细

create feature from text file

时间:2015-02-21 23:22:31      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:

‘‘‘----------------------------------------------------------------------------------
 Tool Name:     CreateFeaturesFromTextFile
 Source Name:   CreateFeaturesFromTextFile.py
 Version:       ArcGIS 9.1
 Author:        Environmental Systems Research Institute Inc.
 Required Argumuments:  An Input Text File containing feature coordinates
                        An Input Character designating the decimal separator used in the text file.
                        An output feature class
 Optional Arguments:    A spatial reference can be specified.  This will be the
                        spatial reference of the output fc.
 Description:   Reads a text file with feature coordinates and creates a feature class
                 from the coordinates.
----------------------------------------------------------------------------------‘‘‘

import string, os, sys, locale, arcgisscripting
gp = arcgisscripting.create()
gp.overwriteoutput = 1

msgErrorTooFewParams = "Not enough parameters provided."
msgUnknownDataType = " is not a valid datatype. Datatype must be point, multipoint, polyline or polygon."
msgErrorCreatingPoint = "Error creating point %s on feature %s"

# sets all the point properties
def createPoint(point, geometry):
    try:
        point.id = geometry[0]
        point.x = geometry[1]
        point.y = geometry[2]
        # When empty values are written out from pyWriteGeomToTextFile, they come as 1.#QNAN
        # Additionally, the user need not supply these values, so if they aren‘t in the list don‘t add them
        if len(geometry) > 3:
            if geometry[3].lower().find("nan") == -1: point.z = geometry[3]
        if len(geometry) > 4:
            if geometry[4].lower().find("nan") == -1: point.m = geometry[4]
        return point
    except:
        raise Exception, msgErrorCreatingPoint


try:
    # get the provided parameters
    inputTxtFile = open(gp.getparameterastext(0))
    fileSepChar = gp.getparameterastext(1)
    outputFC = gp.getparameterastext(2)

    # spatial reference is optional
    outputSR = gp.getparameterastext(3)

    # make sure the text type specified in the text file is valid.
    inDataType = inputTxtFile.readline().strip().lower()
    dataTypes = ["point", "multipoint", "polyline", "polygon"]
    if inDataType.lower() not in dataTypes:
        msgUnknownDataType = "%s%s" % (inDataType, msgUnknownDataType)
        raise Exception, msgUnknownDataType

    # create the new featureclass
    gp.toolbox = "management"
    gp.CreateFeatureclass(os.path.split(outputFC)[0], os.path.split(outputFC)[1], inDataType, "#", "ENABLED", "ENABLED", outputSR)
    # create a new field to assure the id of each feature is preserved.
    idfield = "File_ID"
    gp.addfield(outputFC, idfield, "LONG")
    # get some information about the new featureclass for later use.
    outDesc = gp.describe(outputFC)
    shapefield = outDesc.ShapeFieldName
    # create the cursor and objects necessary for the geometry creation
    rows = gp.insertcursor(outputFC)
    pnt = gp.createobject("point")
    pntarray = gp.createobject("Array")
    partarray = gp.createobject("Array")
    
    locale.setlocale(locale.LC_ALL, ‘‘)
    sepchar = locale.localeconv()[decimal_point]
    
    # loop through the text file.
    featid = 0
    lineno = 1
    for line in inputTxtFile.readlines():
        lineno += 1
        # create an array from each line in the input text file
        values = line.replace("\n", "").replace("\r", "").replace(fileSepChar, sepchar).split(" ")

        # for a point feature class simply populate a point object and insert it. 
        if inDataType == "point" and values[0].lower() != "end":
            row = rows.newrow()
            pnt = createPoint(pnt, values)
            row.SetValue(shapefield, pnt)
            row.SetValue(idfield, int(values[0]))
            rows.insertrow(row)

        # for a multipoint the text file is organized a bit differently.  Groups of points must be inserted at the same time.
        elif inDataType == "multipoint":
            if len(values) > 2:
                pnt = createPoint(pnt, values)
                pntarray.add(pnt)
            elif (len(values) == 2 and lineno != 2) or values[0].lower() == "end":
                row = rows.newrow()
                row.SetValue(shapefield, pntarray)
                # store the feature id just in case there is an error. helps track down the offending line in the input text file.
                if values[0].lower() != "end":
                    row.SetValue(idfield, featid)
                    featid = int(values[0])
                else:
                    row.SetValue(idfield, featid)
                rows.insertrow(row)
                pntarray.removeall()
            elif (len(values) == 2 and lineno == 2):
                featid = int(values[0])

        # for polygons and lines.  polygons have a bit of logic for interior rings (donuts).
        # lines use the same logic as polygons (except for the interior rings)
        elif inDataType == "polygon" or inDataType == "polyline":
            #takes care of 
            #adds the point array to the part array and then part array to the feature
            if (len(values) == 2 and float(values[1]) == 0 and lineno != 2) or values[0].lower() == "end":
                partarray.add(pntarray)
                row = rows.newrow()
                row.SetValue(shapefield, partarray)
                # store the feature id just in case there is an error. helps track down the offending line in the input text file.
                if values[0].lower() != "end":
                    row.SetValue(idfield, featid)
                    featid = int(values[0])
                else:
                    row.SetValue(idfield, featid)
                rows.insertrow(row)
                partarray.removeall()
                pntarray.removeall()
            #adds parts and/or interior rings to the part array
            elif (len(values) == 2 and float(values[1]) > 0) or values[0].lower() == "interiorring":
                partarray.add(pntarray)
                pntarray.removeall()
            #add points to the point array
            elif len(values) > 2:
                pnt = createPoint(pnt, values)
                pntarray.add(pnt)
            elif (len(values) == 2 and lineno == 2):
                featid = int(values[0])

    inputTxtFile.close()
    del rows
    del row
    
except Exception, ErrorDesc:
    # handle the errors here. if the point creation fails, want to keep track of which point failed (easier to fix the
    # text file if we do)
    if ErrorDesc[0] == msgErrorCreatingPoint:
        if inDataType.lower() == "point":
            msgErrorCreatingPoint = msgErrorCreatingPoint % (values[0], values[0])
        else:
            msgErrorCreatingPoint = msgErrorCreatingPoint % (values[0], featid)
        gp.AddError(msgErrorCreatingPoint)
    elif ErrorDesc[0] != "":
        gp.AddError(str(ErrorDesc))

    gp.AddError(gp.getmessages(2))

    # make sure to close up the fileinput no matter what.
    if inputTxtFile: inputTxtFile.close()

 

create feature from text file

标签:

原文地址:http://www.cnblogs.com/gisoracle/p/4297229.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!