Arcgeo

From DreamsteepWiki

Jump to: navigation, search

Here is a (mostly) working collection of python to process geometry MY WAY using ESRI



#################################

"""
import sys_arclink_geometry


#TL= sys_arclink_geometry.TYPELESS()
#TL.set_query_obj('C:/test.shp')
#TL.list_query_objects()
#TL.list_all_folder('C:/keith')
#TL.do_query()


####################################
################################################


#THE "GATHERER "
GATH= sys_arclink_geometry.GIS_GATHER()
#GATH.walkFoldersGetFilenames('C:/data','shp','C:/eatmee.txt')
############

############
GATH.scan_all_known('C:/data')
GATH.show_all_data_found()
############

#GATH.getinfo_ESRI( GATH.sorted_rasters[0])

GATH.getinfo_feature( GATH.sorted_vectors[0])

GATH.getinfo_raster( GATH.sorted_rasters[0])


############
#ATTR INFO
#GATH.getinfo_attrs( GATH.sorted_vectors[0])
############

############
"""

####  ### ### ###  ####  ### ### ### ####  ### ### ### ####  ### ### ###
####  ### ### ###  ####  ### ### ### ####  ### ### ### ####  ### ### ###



import win32com.client, sys, os, math
import os

##

import sys_file_io
import sys_arclink_ATTRS
import sys_sp_treat

  
####  ### ### ###  ####  ### ### ### ####  ### ### ### ####  ### ### ###
  ####  ### ### ###  ####  ### ### ### ####  ### ### ### ####  ### ### ###

try:
  #import relevant modules, create geoprocessing dispatch object
  import win32com.client
  gp = win32com.client.Dispatch("esriGeoprocessing.gpDispatch.1")

except:
  print 'WARN NO ESRI SUPPORT FROM CURRENT SHELL '


def AddPrintMessage(msg, severity):
    print msg
    if severity == 0: gp.AddMessage(msg)
    elif severity == 1: gp.AddWarning(msg)
    elif severity == 2: gp.AddError(msg)
    

####  ### ### ###  ####  ### ### ### ####  ### ### ### ####  ### ### ###
  ####  ### ### ###  ####  ### ### ### ####  ### ### ### ####  ### ### ###

"""
##############
EXAMPLE USAGE:
##############

###
import sys_arclink_geometry
TL =  sys_arclink_geometry.TYPELESS()
TL.set_base_fr_data('C:/foo.tiff')

###

###
## BUILD A BBOX AROUND AN EXTENT
## [ xmin,ymin , xmax,ymax]



XTNTS= TL.getinfo_extents('C:/crap1.shp')
TL.gen_box_xtnts(XTNTS,'C:/data','beetbeets')
TL.set_projection ( 'C:/data/beetbeets.shp','C:/base.prj' )


###########


###
#GEOMETRY
import sys_arclink_geometry

######
#USING TEXT POINTS
TYPLESS =sys_arclink_geometry.TYPELESS()
ARRAY = TYPLESS.load_feature_points('C:/spring_crp_1.shp')
if len(ARRAY)>1:
  print 'is multipart ..'
  for ietm in  ARRAY[1]:
       print ietm
else:
  print ARRAY

##
#GET THE FIRST VERTEX OF EACH FEATURE ##
ARRAY = TL.load_feature_points('C:/beetbeets.shp')
lenar=len(ARRAY)
if lenar>1:
  print 'is multipart .. '+str(lenar)
  for ietm in  ARRAY:
       print ietm[1]
else:
  print ARRAY
  
TYPLESS.report_multipart_point_buffer_size()
####################################################

import sys_arclink_geometry

TYPLESS =sys_arclink_geometry.TYPELESS()
ARRAY = TYPLESS.load_feature_points('C:/tigernoty.shp')
TYPLESS.point_array_to_poly(ARRAY[1],'C:/','fuckheed.shp')



#################################
#CHECK IF FEATURES IN A SHAPE ARE CLOSED

##
ARRAY = TL.load_feature_points('C:/tigernoty.shp')
##

count = 0
for poly in ARRAY:
 if TL.check_if_closed(poly) :
   print str(count)+' IS  CLOSED '
 count=count+1

###

"""


####  ### ### ###  ####  ### ### ### ####  ### ### ### ####  ### ### ###
  ####  ### ### ###  ####  ### ### ### ####  ### ### ### ####  ### ### ###
"""
## typeless GIS data interaction ##

##

ARRAY = TL.load_feature_points('C:/bonkers.shp')

##

#TL.point_array_to_polyline(ARRAY[2],'C:/','allfuck.shp')
#TL.point_array_to_poly(ARRAY[0],'C:/','fuckall.shp')
#TL.point_array_to_points(ARRAY[2],'fuckalltree.shp')


"""

class TYPELESS:

    def __init__(self):
        self.prj_file       = ''
        self.units          = 'meter' #meter foot arcdegree , etc
        self.ORIGIN         = []
        ####################
        self.geodatabase    = ''
        self.USE_PROJECTION = 1
        ####################
        self.SP_INFO        =  sys_sp_treat.GET_INFO()
        self.ATTRED         =  sys_arclink_ATTRS.ESRI_ATTR_EDIT()
        ####################
        self.MULTIPART_PNT_BUFFER           = []
        #####################

    #####################
    def getinfo_datatype(self,dataset):
        return self.SP_INFO.getDataClassType(dataset)
    ############
    def getinfo_featuretype(self,dataset):
        OUT= self.SP_INFO.getSHPType(dataset)
        #print OUT
        return OUT[0]
        #getinfo_featuretype

    ############
    def getinfo_numparts(self,dataset):
        ARRAY = self.load_feature_points(dataset)
        return len(ARRAY)

    ############
    ## ([ xmin,ymin , xmax,ymax])
    def getinfo_extents(self,dataset):
        #print self.SP_INFO.getEXTNTS(dataset)
        return self.SP_INFO.getEXTNTS(dataset)
        
    ###########################################
    ###########################################
    # ([ xmin,ymin , xmax,ymax | ((zmin,zmax)) ])
    ###########################################
    def getinfo_extents_array(self,ARRAY):
       XMIN =0
       YMIN =0
       ZMIN =0
       XMAX =0
       YMAX =0
       ZMAX =0
       ##
       storex = []
       storey = []
       storez = []
       ##

       for point in ARRAY:
          storex.append(point[0])
          storey.append(point[1])
          storez.append(point[2])
       ##
       storex.sort()
       storey.sort()
       storez.sort()
       ##
       sort_x = storex
       sort_y = storey
       sort_z = storez
       
       #
       length = (len(sort_x)-1)
       XMIN =sort_x[0]
       YMIN =sort_y[0]
       ZMIN =sort_z[0]
       XMAX =sort_x[length]
       YMAX =sort_y[length]
       ZMAX =sort_z[length]
       
       #XMIN YMIN XMAX YMAX ( ZMIN ZMAX )
       OUTPUT = [XMIN,YMIN,XMAX,YMAX,ZMIN,ZMAX]
       ##
       return OUTPUT
    #####################
    def getinfo_lengthXYZ_XTNTX(self,XTNTX):
       XLENGTH = XTNTX[2]-XTNTX[0]
       YLENGTH = XTNTX[3]-XTNTX[1]
       #debug
       #ZLENGTH = XTNTX[5]-XTNTX[4]
       ZLENGTH = 0
       ##              ##
       OUTPUT = [XLENGTH,YLENGTH,ZLENGTH]
       return OUTPUT
    #####################
    def getinfo_lengthXYZ_array(self,ARRAY):
       #XMIN YMIN XMAX YMAX ( ZMIN ZMAX )
       XTNTX = self.getinfo_extents_array(ARRAY)
       XLENGTH = XTNTX[2]-XTNTX[0]
       YLENGTH = XTNTX[3]-XTNTX[1]
       ZLENGTH = XTNTX[5]-XTNTX[4]
       ##              ##
       OUTPUT = [XLENGTH,YLENGTH,ZLENGTH]
       return OUTPUT
    #####################
    def getinfo_centroidXYZ_array(self,array):
       lengthXYZ = self.getinfo_lengthXYZ_array(array)
       XTNTX = self.getinfo_extents_array(array)
       #XMIN YMIN XMAX YMAX ( ZMIN ZMAX )
        ## ##
       mid_x = XTNTX[0]+lengthXYZ[0]/2
       mid_y = XTNTX[1]+lengthXYZ[1]/2
       mid_z = XTNTX[4]+lengthXYZ[2]/2
       return [mid_x,mid_y,mid_z]

    #######
    #ATTR EDITING
    # attr_edit_setattr(object,attr,newvalue)
    #######
    def attr_edit_listAttrs(self,obj):
         attrs = self.ATTRED.listAttrs(obj)
         print attrs
    #######
    """
    TYPES ARE
    Text   - Names or other textual qualities.
    Float  - Numeric values with fractional values within a specific range.
    Double - Numeric values with fractional values within a specific range.
    Short  - Numeric values without fractional values within a specific range; coded values.
    Long   - Numeric values without fractional values within a specific range.
    Date   - Date and/or Time.
    Blob   - images or other multimedia.
    """
    ##
    """
    attr_edit_addattr('C:/crap1.shp','hyperlink','Text')
    """
    def attr_edit_addattr (self,feature,attrname,fldtype):
          self.ATTRED.addAttr(feature,attrname,fldtype)
    #list all GIS data in a folder
    def list_all_folder(self,folderpath):
        print 'GIS DATA SETS '
        print self.SP_INFO.listAllDataSets(folderpath,'dataset')
        print 'RASTER '
        print self.SP_INFO.listAllDataSets(folderpath,'raster')
        print 'VECTOR  '
        print self.SP_INFO.listAllDataSets(folderpath,'vector')
        
        
    #######
    # def show(self):
    #   print 'CURRENT PROJECTION IS '
    #######
    """
    build smaller grid system based on extents
    """
    #def subdivide(self,numX,numY,extents,base_attrs):
    #######
    """
    set_projection ( 'C:/grid_0_0.shp','C:/base.prj' )

    """
    def set_projection(self,dataset,projection):
        print '### define projection :  '+ dataset
        ###
        if self.USE_PROJECTION == 1:  #??WHY IS THIS A TOGGLE?
           gp.DefineProjection(dataset,projection )#grid_0_0 C:/base.prj
    ######################################################################
    ######################################################################
    """
    read a ; seperated xyz text file

    shapeindex;X;Y;  (Z?)
    
    """
    #def array_to_file()
    
    def file_to_array(self,inputfile):
       fhandler = sys_file_io.file_io_three()
       fhandler.readfilelines( inputfile )
       return fhandler.filecontents_list

    ## ############################################
    
    """
    #build 20 interwoven concentric shapefiles #
    #
    num = 10
    for a in range(num):
       scale = a * 1000
       TL.gengenbox([5000,5000],scale,'C://', ('skeeter'+str(a)) )
       TL.gengenbox([0,0]      ,scale,'C://', ('cheater'+str(a)) )
    ##
    
    #extents
    
    # gengenbox (self,ORIGIN,scale,outpath,outshapename):
    
    """
    ## ############################################
    def gengenbox (self,ORIGIN,scale,outpath,outshapename):
       array = []
       #
       extnts_x_min = str(ORIGIN[0]+-scale)
       extnts_x_max = str(ORIGIN[0]+scale)
       extnts_y_min = str(ORIGIN[1]+-scale)
       extnts_y_max = str(ORIGIN[1]+scale )
       ##
       si = str(1)   #(shapeindex)
       array.append(si+';'+extnts_x_min+';'+extnts_y_max+';'  )
       array.append(si+';'+extnts_x_min+';'+extnts_y_max+';'  )
       array.append(si+';'+extnts_x_max+';'+extnts_y_max+';'  )
       si = str(2)   #(shapeindex)
       array.append(si+';'+extnts_x_max+';'+extnts_y_max+';'  )
       array.append(si+';'+extnts_x_max+';'+extnts_y_min+';'  )
       si = str(3)   #(shapeindex)
       array.append(si+';'+extnts_x_max+';'+extnts_y_min+';'  )
       array.append(si+';'+extnts_x_min+';'+extnts_y_min+';'  )
       si = str(4)   #(shapeindex)
       array.append(si+';'+extnts_x_min+';'+extnts_y_min+';'  )
       array.append(si+';'+extnts_x_min+';'+extnts_y_max+';'  )
       si = str(5)   #(shapeindex)
       array.append(si+';'+extnts_x_min+';'+extnts_y_max+';'  )
       array.append(si+';'+extnts_x_max+';'+extnts_y_max+';'  )
       ##
       self.point_array_to_polyline( array,outpath,(outshapename+'.shp'))
       ##
    ## ############################################
    """
    [ xmin,ymin , xmax,ymax]
    
    build a scaled box around extents of a feature
    ##
    
    """
    def gen_box_xtnts (self,XTNTS,outpath,outshapename):
       array = []
       MODE  = 'closed_polyline'  #'polygon' # 'polyline' # ' ' #
       #
       #scale = 100
       ##
       extnts_x_min = str( XTNTS[0] )
       extnts_y_min = str( XTNTS[1] )
       extnts_x_max = str( XTNTS[2] )
       extnts_y_max = str( XTNTS[3] )
       ###########
       if MODE=='polyline':
           ##
           si = str(1)   #(shapeindex)
           array.append(si+';'+extnts_x_min+';'+extnts_y_max+';'  )
           array.append(si+';'+extnts_x_min+';'+extnts_y_max+';'  )
           array.append(si+';'+extnts_x_max+';'+extnts_y_max+';'  )
           si = str(2)   #(shapeindex)
           array.append(si+';'+extnts_x_max+';'+extnts_y_max+';'  )
           array.append(si+';'+extnts_x_max+';'+extnts_y_min+';'  )
           si = str(3)   #(shapeindex)
           array.append(si+';'+extnts_x_max+';'+extnts_y_min+';'  )
           array.append(si+';'+extnts_x_min+';'+extnts_y_min+';'  )
           si = str(4)   #(shapeindex)
           array.append(si+';'+extnts_x_min+';'+extnts_y_min+';'  )
           array.append(si+';'+extnts_x_min+';'+extnts_y_max+';'  )
           si = str(5)   #(shapeindex)
           array.append(si+';'+extnts_x_min+';'+extnts_y_max+';'  )
           array.append(si+';'+extnts_x_max+';'+extnts_y_max+';'  )
           ##
           self.point_array_to_polyline( array,outpath,(outshapename+'.shp'))
       ###########
       #if MODE=='closed_polyline':

       #if MODE=='polygon':

       return (outshapename+'.shp')

    ######################################################################
    #### ##########################################################
    """
    output ; number of shapes , number of vertecies per shape
    """
    def report_multipart_point_buffer_size(self):
       number = len(self.MULTIPART_PNT_BUFFER)
       lengths =[]

       for a in range (number):
          lengths.append( len(self.MULTIPART_PNT_BUFFER[a]) )
       #debug add pointid in
       print 'Total      :'+str(number)
       for ind in lengths:
         print 'Individual :'+str(ind)
    ##################
    """
    make an array of array of points for each part (line only?)
    DEBUG ?unfinished
    """
    def check_if_closed(self,array):
         firstArray =   array[0]
         lastArray =    array[len(array)-1]
         if firstArray[0] == lastArray[0] and firstArray[1] == lastArray[1]:
             return 1
         return 0
    ####
    #debug , add a function to close open segments
    def close_point_array(self,array):
         check = self.check_if_closed(array)
         if check==0:
           print 'DEBUG CLOSE '
           first = array[0]
           array.append(first)
         return array
    ####
    def open_point_array(self,array):
         check = self.check_if_closed(array)
         if check==1:
           print 'DEBUG OPEN '
           array.pop()
         return array
    ####
    #debug untested#
    #could be used to query extents of a multi part feature
    def flatten_array(self,ARRAY_MULTI):
        OUTPUT = []
        for ARRAYY in ARRAY_MULTI:
           for element in ARRAYY:
             OUTPUT.append(element)
        return OUTPUT
        
    ###  ###  ### #### ##    #    ###  ###  ### #### ##
    ## ###  ###  ### ####    #    ###  ###  ### #### ##
    """
    #TYPLESSLY LOAD POINTS FROM A SHAPEFILE #
    point,line,polygon type is indifferent
    returns an array , or an array of arrays depending on type and number of features
    copies it to the self.MULTIPART_PNT_BUFFER
    """
    def load_feature_points(self,inSF):
        ##CHECK FILE TYPE           ###
        GIS_TYPE = self.getinfo_datatype(inSF)
        if GIS_TYPE!='FeatureClass':
           print 'DATA TYPE '+ GIS_TYPE  +' IS NOT ALLOWED ONLY FEATURE CLASS '
           return None
        ####                        ###
        DATATYPE = self.getinfo_featuretype(inSF)
        if DATATYPE==None:
           print 'ERROR NO TYPE DEFINED'
           print 'Feature is '  +inSF
           print '###################'
           return None
        ####                        ###
        if DATATYPE=='Point' :
            self.MULTIPART_PNT_BUFFER = []
            if os.path.lexists(inSF)==0:
               print 'load_feature_points no file ' +inSF+' exists '
               return ''  #debug
            ##                           ##
            desc_inSF    = gp.describe(inSF)
            sr           = desc_inSF.spatialreference
            searchRecs   = gp.searchcursor(inSF)
            searchRec    = searchRecs.next()
            while searchRec:
                OUTVERTS =[]
                testPt = searchRec.shape.getpart()
                OUTVERTS.append( [testPt.x,testPt.y,testPt.z] )
                searchRec = searchRecs.next()
                self.MULTIPART_PNT_BUFFER.append(OUTVERTS)
            return self.MULTIPART_PNT_BUFFER
        ########
        if DATATYPE=='Polygon' or DATATYPE=='Polyline':
            ########
            self.MULTIPART_PNT_BUFFER = []
            if os.path.lexists(inSF)==0:
               print 'load_feature_points no file ' +inSF+' exists '
               return ''  #debug
            #
            desc_inSF    = gp.describe(inSF)
            sr           = desc_inSF.spatialreference
            searchRecs   = gp.searchcursor(inSF)
            searchRec    = searchRecs.next()
            while searchRec:
                OUTVERTS =[]
                lastArray = searchRec.shape.getpart(0)
                testPt = lastArray.next()

                while testPt:
                    lastPt = testPt
                    OUTVERTS.append( [testPt.x,testPt.y,testPt.z] ) #testPt.id  #XYZ POINTS AS TEXT
                    #
                    testPt = lastArray.next()
                searchRec = searchRecs.next()
                #get verts for each (closed line ) PART
                self.MULTIPART_PNT_BUFFER.append(OUTVERTS)

              #??
            return self.MULTIPART_PNT_BUFFER
        
    ########################################################################
    ########################################################################
    #### ##########################################################
    def get_spat_ref(self,object):
        return self.SP_INFO.getSpatRef(object)

    ###############################
    """
    #SINGLE POLYGON #
     [ [0.0,0.0,0.0] , [1.0,1.0,1.0] ]
    """
    ###############################
    
    def point_array_to_poly(self,ARRAY,outpath,outSF ):#,spatref):
        gp.overwriteoutput = 1
        #outpath ='C:/'
        gp.CreateFeatureclass( outpath , outSF ,'POLYGON' ) #,spatref)
        cur = gp.InsertCursor(outSF)
        lineArray = gp.CreateObject("Array")
        pnt = gp.CreateObject("Point")
        ######################
        #iterate the array ( [ [x,y,z],[x,y,z] ])
        for element in ARRAY:
           pnt.x = float(element[0])
           pnt.y = float(element[1])
           #pnt.z = float(element[2])
           lineArray.Add(pnt)
        ######################
        # Create a new row, or feature, in the feature class
        feat = cur.NewRow()
        # Set the geometry of the new feature to the array of points
        feat.shape = lineArray
        # Insert the feature
        cur.InsertRow(feat)
        
    ########
    # def point_multiarray_to_poly
    ########################################################################
    ########################################################################
    """
    #SINGLE POLYLINE #
    """
    def point_array_to_polyline (self,arraydata,outpath,outSF):
       #outpath = 'C:/'
       gp.overwriteoutput = 1
       gp.CreateFeatureclass( outpath , outSF ,'POLYLINE')
       cur       = gp.InsertCursor( outSF )
       lineArray = gp.CreateObject("Array")
       pnt       = gp.CreateObject("Point")
       for line in arraydata:
        #pnt.id = line[0]
        pnt.x  = float(line[0])
        pnt.y  = float(line[1])
        #pnt.z  = line[2]
        #
        lineArray.add(pnt)
        #####
        feat = cur.NewRow()
        feat.shape = lineArray
        cur.InsertRow(feat)
        #####
        lineArray.add(pnt)
    ##############
    """
    #MULTI POLYLINE #
    """
    def point_multiarray_to_polyline (self,arraydata,outpath,outSF):
       #outpath = 'C:/'
       gp.overwriteoutput = 1
       gp.CreateFeatureclass( outpath , outSF ,'POLYLINE')
       cur       = gp.InsertCursor( outSF )
       lineArray = gp.CreateObject("Array")
       pnt       = gp.CreateObject("Point")
       #ID = -1
       for line in arraydata:
        #pnt.id = line[0]
        pnt.x  = float(line[0])
        pnt.y  = float(line[1])
        #pnt.z  = line[2]
        #
        lineArray.add(pnt)

        #####
        feat = cur.NewRow()
        feat.shape = lineArray
        cur.InsertRow(feat)
        #####
        lineArray.add(pnt)
        #ID=pnt.id
        
    #### ##########################################################
    """
    # POINT #
    """
    def point_array_to_points (self,arraydata,outpath,outSF):
       #outpath = 'C:/'
       gp.overwriteoutput = 1
       gp.CreateFeatureclass( outpath , outSF ,'POINT')
       cur       = gp.InsertCursor( outSF )
       pnt       = gp.CreateObject("Point")
       for line in arraydata:
          pnt.x  = float(line[0])
          pnt.y  = float(line[1])
          #pnt.z  = float(line[2])
          #####
          feat = cur.NewRow()
          feat.shape = pnt
          cur.InsertRow(feat)
          #####


    #### ##########################################################
    #### ##########################################################
    """
    make an array of points , centroid to the make grid_lattice function
    """
    def gen_pointgrid (self,sFcName,sType,XTNTS,stepMode,MDAT,NDAT):
          EXTNTS_LENGTH = []
          #XYZ_LENGTHS= self.getinfo_lengthXYZ_array(XTNTS)
          XYZ_LENGTHS=self.getinfo_lengthXYZ_XTNTX(XTNTS)
          #########################
          theLeft    =XTNTS[0]
          theRight   =XTNTS[2]
          theBottom  =XTNTS[1]
          theTop     =XTNTS[3]
          ##########################
          OUTARRAY = []
          ##########################
          if stepMode == 'GRIDSIZE':
            m = float(MDAT)
            n = float(NDAT)
          ##########################
          if stepMode == 'CELLSIZE':
            xsize = float(MDAT)
            ysize = float(NDAT)
            m=(theRight-theLeft)/xsize
            n=(theTop-theBottom)/ysize
            if sType == 'POINT':
              m = m+1
              n = n+1
          ##########################
          NUMX = MDAT
          NUMY = NDAT

          LENGTH_DIVX =  (XYZ_LENGTHS[0]/NUMX)
          LENGTH_DIVY =  (XYZ_LENGTHS[1]/NUMY)
          #
          HALF_X = LENGTH_DIVX/2
          HALF_Y = LENGTH_DIVY/2
          #
          cent_x = theRight- theLeft
          cent_y = theTop- theBottom
          #
          point = []
          #
          for a in range(NUMX):
             ##    ##
             for b in  range(NUMY):
                 xdist = HALF_X+(theLeft     + (a*LENGTH_DIVX))
                 ydist = HALF_Y+(theBottom   + (b*LENGTH_DIVY))

                 #point = [(xdist-HALF_X),(ydist-HALF_Y)  ,0 ]
                 point = [xdist ,ydist ,0 ]
                 OUTARRAY.append(point)
          ##############################
          return OUTARRAY

    ###########################################
    def  sjm_linesegments_to_angle_csv(self,infile,outfile):
        strFeatureLayer = infile#gp.GetParameterAsText(0)
        strfilename = outfile.replace("\\","/")
        if ".csv" not in strfilename:
            strfilename += ".csv"
        descFeatureLayer = gp.describe(strFeatureLayer)

        #FID is the feature identifier
        strFID1 = "-1"
        strFID2 = "-1"

        #open the file for
        csvRotationFile = open(strfilename, "w")
        strWriteline = "FID,rotation_Angle" + "\n"
        csvRotationFile.write(strWriteline)

        #Ensure this is a polyline layer
        if descFeatureLayer.ShapeType == "Polyline":

            #Name of the feature layer
            gp.AddMessage(strFeatureLayer)

            rows = gp.searchcursor(strFeatureLayer)
            row = rows.next()

            #Loop through the features
            while row:

                #Get the points the make up the polyline
                lstPoints = row.shape.GetPart(0)

                #Loop through the point string for the polylines
                pnt = lstPoints.next()
                while pnt:

                    #compute the rotation angle
                    if str(strFID1) == str(row.FID):

                        #Get the current point
                        strX2 = str(pnt.X)
                        strY2 = str(pnt.Y)
                        strFID2 = str(row.FID)

                        #Figure out the delta
                        deltaX = float(strX2) - float(strX1)
                        if deltaX == 0:
                            deltaX = 0.1
                        deltaY = float(strY2) - float(strY1)

                        angle = math.atan2 (deltaY, deltaX)
                        angle = math.degrees (angle)
                        angle = 90 - angle

                        #Print the results to the file and the console
                        strWriteline = str(row.FID) + "," + str(angle) + "\n"
                        csvRotationFile.write(strWriteline)
                        gp.AddMessage(strWriteline)

                    #Next point in the collection
                    strX1 = str(pnt.X)
                    strY1 = str(pnt.Y)
                    strFID1 = str(row.FID)
                    pnt = lstPoints.next()


                #Next feature in the dataset
                #gp.AddMessage("**** " + str(row.FID))
                row = rows.next()
        else:

            gp.AddMessage ("Not a polyline layer")

        #Print the completion message
        csvRotationFile.close()
        gp.AddMessage("All done")



####  ### ### ###  ####  ### ### ### ####  ### ### ### ####  ### ### ###
  ####  ### ### ###  ####  ### ### ### ####  ### ### ### ####  ### ### ###
"""
this is the "mfolderloader" ptyhon model ,put into a function since its
so durn handy
"""

class GIS_GATHER:
     def __init__(self):
         #self.FOUND_DATASETS  = []
         #
         self.sorted_rasters      = [] #targz,tiff  etc
         self.sorted_elevations   = [] #dem,arcgrid
         self.sorted_vectors      = [] #shp,txt,  etc
         self.sorted_geodatabases = [] #
         self.sorted_kgraphs      = [] #
         ##
         #self.spatial_treatment   = sys_sp_treat.SP_TREATMENT()
         self.sp_INFO             = sys_sp_treat.GET_INFO()
     ############
     #find out the type of a dataset
     def getinfo_type(self,dataset):
        print self.sp_INFO.getDataClassType(dataset)
       # #  #
     #find out about feature classes
     def getinfo_feature(self,dataset):
        print self.sp_INFO.getFeatureInfo(dataset)
        return self.sp_INFO.getFeatureInfo(dataset)
       # #  #
     def getinfo_extents(self,dataset):
        print self.sp_INFO.getEXTNTS(dataset)
        return self.sp_INFO.getEXTNTS(dataset)

       # #  #
     #find out about rasters
     def getinfo_raster(self,dataset):
        print self.sp_INFO.getDataClassType(dataset)
        return self.sp_INFO.getDataClassType(dataset)

       # #  #
     #esri GIS info
     def getinfo_ESRI(self,dataset):
        print self.sp_INFO.getDataClassInfo(dataset)

       # #  #
     #get the centroid of a dataset
     def getinfo_centroid(self,dataset):
        XTNTS= self.sp_INFO.getEXTNTS(dataset)
        #DEBUG UNTESTED
        #return self.sp_INFO.getEXTNTS(dataset)
        length_x=XTNTS[0]-XTNTS[2]
        length_y=XTNTS[1]-XTNTS[3]

        center_x = length_x/2
        center_y = length_y/2
        #DEBUG UNTESTED

        # #  #
     #get the attrs from a dataset
     def getinfo_attrs(self,dataset):
        print self.sp_INFO.listAttrs(dataset)


     ############
     def show_all_data_found(self):
         out=[]
         out.append(self.sorted_rasters )
         out.append(self.sorted_elevations )
         out.append(self.sorted_vectors )
         out.append(self.sorted_geodatabases )
         out.append(self.sorted_kgraphs )
         ##
         print '## rasters '
         print self.sorted_rasters       #targz,tiff  etc
         print '## elevations '
         print self.sorted_elevations    #dem,arcgrid
         print '## vectors '
         print self.sorted_vectors       #shp,txt,  etc
         print '## geodatabases '
         print self.sorted_geodatabases  #
         print '## kgraphs '
         print self.sorted_kgraphs


     """
     scan a folder for feature classes
     """
     def scan_features(self,folder):
       print 'scanning folder '+folder+' for all features '
       return self.walkFoldersGetFilenames( folder,'fc')
       #return out

     ############
     """
     scan a folder for rasters
     """
     def scan_rasters(self,folder):
       print 'scanning folder '+folder+' for all features '
       return self.walkFoldersGetFilenames( folder,'raster')

     ############
     ############
     ############
     """
     do a recursive scan (walkFoldersGetFilenames) for each type of data (. extention)
     """
     def scan_all_known(self,folder):
       out= []
       print 'scanning folder '+folder+' for all known GIS data types '
       print 'feature classes..'
       out.append(self.walkFoldersGetFilenames(folder,'fc') )
       print 'rasters ..'
       out.append(self.walkFoldersGetFilenames(folder,'raster') )
       print 'tag.gz  ..'
       out.append(self.walkFoldersGetFilenames(folder,'TARGZ') )
       out.append(self.walkFoldersGetFilenames(folder,'targz') )
       print 'png ..'
       out.append(self.walkFoldersGetFilenames(folder,'png') )
       print 'tiff files ..'
       out.append(self.walkFoldersGetFilenames(folder,'tiff') )
       out.append(self.walkFoldersGetFilenames(folder,'TIF') )
       print 'dems ..'
       out.append(self.walkFoldersGetFilenames(folder,'dem') )
       print 'kgraphs ..'
       out.append(self.walkFoldersGetFilenames(folder,'klsys') )

       return out #kind of redundant


     ############
     """
     look through a folder for a file with a certain extention
     """
     def walkFoldersGetFilenames (self,foldervar,extention):
       ARGONE = foldervar
       ARGONE =foldervar.replace('\\','/')
       ARGTWO  = extention
       #filenames =[]

       if len(ARGONE)==0 or len(ARGTWO)==0:
         print 'ERROR REQUIRES TWO ARGS'
         return 0

       if os.path.lexists(foldervar)==0:
         print 'folder '+foldervar+' does not exist'

       if os.path.lexists(foldervar):
         folders = os.listdir(foldervar)
         folder= foldervar.replace('\\','/')
         gp.workspace  = folder
         #print ' LOOKING IN FOLDER : ' + folder  #DEBUG
         if ARGTWO == 'fc':
          fcs= gp.ListFeatureClasses()
          fcs.reset()
          fc = fcs.next()
          while fc :
            self.sorted_vectors.append('\n'+folder+'/'+fc)
            fc=fcs.next()
         ##
         if ARGTWO == 'raster':
          fcs= gp.ListRasters()
          fcs.reset()
          fc = fcs.next()
          while fc :
            bufferdata = (folder+'/'+fc+'/w001001.adf')
            if os.path.lexists(bufferdata):
                self.sorted_elevations.append('\n'+bufferdata)
            else:
                if os.path.lexists((folder+'/'+fc)):
                  self.sorted_rasters.append( ('\n'+folder+'/'+fc) )

            ######
            fc=fcs.next()

         ## NON-GP objects
         ####case for objects NOT recognized by gp (like TGZ, etc)
         if ARGTWO == 'TARGZ':
           fhandler =  sys_file_io.file_io_three()
           fhandler.getcontentsdir_filter(folder,'TAR.GZ')
           buffervar = fhandler.dir_contents_list
           for filename in buffervar:
              self.sorted_elevations.append('\n'+folder+'/'+filename)
         ##
         if ARGTWO == 'targz':
           fhandler =  sys_file_io.file_io_three()
           fhandler.getcontentsdir_filter(folder,'tar.gz')
           buffervar = fhandler.dir_contents_list

           for filename in buffervar:
              self.sorted_elevations.append('\n'+folder+'/'+filename)

         ##ALTHOUGH THESE MAY BE RECOGNIZED BY GP , I WANTED MY OWN WAY TO DO IT ALSO
         if ARGTWO == 'png':
           fhandler =  sys_file_io.file_io_three()
           fhandler.getcontentsdir_filter(folder,'.png')
           buffervar = fhandler.dir_contents_list
           for filename in buffervar:
              self.sorted_rasters.append('\n'+folder+'/'+filename)

         ##ALTHOUGH THESE MAY BE RECOGNIZED BY GP , I WANTED MY OWN WAY TO DO IT ALSO
         if ARGTWO == 'tiff':
           fhandler =  sys_file_io.file_io_three()
           fhandler.getcontentsdir_filter(folder,'.tiff')
           buffervar = fhandler.dir_contents_list
           for filename in buffervar:
              self.sorted_rasters.append('\n'+folder+'/'+filename)

         if ARGTWO == 'TIF':
           fhandler =  sys_file_io.file_io_three()
           fhandler.getcontentsdir_filter(folder,'.TIF')
           buffervar = fhandler.dir_contents_list
           for filename in buffervar:
              self.sorted_rasters.append('\n'+folder+'/'+filename)

         ##ALTHOUGH THESE MAY BE RECOGNIZED BY GP , I WANTED MY OWN WAY TO DO IT ALSO
         if ARGTWO == 'dem':
           fhandler =  sys_file_io.file_io_three()
           fhandler.getcontentsdir_filter(folder,'.dem')
           buffervar = fhandler.dir_contents_list
           for filename in buffervar:
              self.sorted_elevations.append('\n'+folder+'/'+filename)

         #DEBUG DOES NOT SEEM TO WORK
         if ARGTWO == 'klsys':
           fhandler =  sys_file_io.file_io_three()
           fhandler.getcontentsdir_filter(folder,'.klsys')
           buffervar = fhandler.dir_contents_list
           for filename in buffervar:
              self.sorted_kgraphs.append('\n'+folder+'/'+filename)


         ##########################
         #####Recursive call ######
         for folder in folders:
          if os.path.isdir((foldervar+'/'+folder)):
            self.walkFoldersGetFilenames ((foldervar+'/'+folder),extention)

    



Personal tools