creating class

1278
7
Jump to solution
03-20-2020 03:12 PM
CNRFGN
by
New Contributor II

hi guys, is anybody can help me with this?

Consider a text file called trees.txt with different fields called Block, Plot, Species and DBH, separated by spaces. Every record represents one tree. DBH is the trunk diameter at 4.5 feet from the ground. Create a script with a tree class with the following properties: Block, Plot, Species and DBH. The class should also have one method: diameter inside bark, calculated as DIB = DBH * (1/1.09). Once the class has been created, use the class to create tree objects by reading the data from the text file. The script should print the following: Report Tree 1

Block:

Plot:

Species:

DBH:

DIB:

Report Tree 2

Block:

etc

0 Kudos
1 Solution

Accepted Solutions
RandyBurton
MVP Alum

Your tree class looks good, with one possible exception.  The next to last line appears to need indentation.  When sharing Python scripts, it is good to use the "syntax highlighter" when posting to GeoNet.  There are some good instructions on using the highlighter here: Code Formatting... the basics++ Here is what your code looks like using the highlighter with the indentation corrected:

class Tree:
    def __init__(self, block, plot, species, dbh):
        self.block = block
        self.plot=plot
        self.species=species
        self.dbh=dbh    

    def dib(self):
        dib = self.dbh * (1/1.09) # 1/1.09 = 0.917431193
        return dib
‍‍‍‍‍‍‍‍‍‍

Also in line 9, I added some parenthesis around the 1/1.09.  I don't think it matters in this case, but it insures the division happens before the multiplication.  You could also use the 0.91743 equivalent.

For the next step, you will need some code to read your text file.  Here's a basic approach.  It assumes the text file does not have a header.

filename = r"C:\Path\to\trees.txt" # enter full path and filename
tf = open(filename, 'r')

treeData = tf.readlines()

for row in treeData:
    td = row.strip().split() # strip any line feeds, then split on spaces
    print td

tf.close()

I created a simple tree data file, and the script prints out:

['1', '1', 'cedar', '4.5']
['1', '2', 'spruce', '3.75']
['2', '1', 'hemlock', '2.5']

Note that a list is produced and all the elements are text (in quotes).  It is possible that the Block and Plot will be text, but they could be numbers.  The DBH data is probably a floating point number, so you will need to change it from type text to float.  The next steps are to include the tree class and print the results.  This should be similar to your parcels  example.

You may need to deal with a header row when reading your text file.  If you were wanting to number each tree by row in the file, you will need a counter.

Let me know how this part goes.

View solution in original post

7 Replies
ChristopherBertrand
Occasional Contributor

Hi CRNF,

Could you clarify what you want the output to be and what your input is?  Are you starting with a text file or you are looking for a script to produce a text file from a feature class/shapefile/etc?

0 Kudos
CNRFGN
by
New Contributor II

start with the text file trees.txt withw different fields called Block, Plot, Species and DBH, separated by spaces.

0 Kudos
MichaelVolz
Esteemed Contributor

Do you have any spatial information in the txt file such as latitude and longitude?  If not, are you joining to join this data to a feature class that does have spatial information?

0 Kudos
RandyBurton
MVP Alum

I assume this is related to your question about Exercise 12.  The parcel class script used in that exercise can be used as a pattern to create a tree class.  Once the class is created, then you would come up with a way to read the lines in the text file.  Here is the parcel class example:

class Parcel:
    def __init__(self, landuse, value):
        self.landuse = landuse
        self.value = value
        
    def assessment(self):
        if self.landuse == "SFR":
            rate = 0.05
        elif self.landuse == "MFR":
            rate = 0.04
        else:
            rate = 0.02
        assessment = self.value * rate
        return assessment‍‍‍‍‍‍‍‍‍‍‍‍‍‍
  1. In line 1 change Parcel to Tree.
  2. In lines 2, 3 and 4, replace landuse and value with block, plot, species and dbh. (You'll be adding a couple of new lines in this section.)
  3. In lines 6, 13 and 14, replace assessment with dib.
  4. In line 13, replace value with dbh, and replace rate  with your numeric value.
  5. Delete lines 7 thru 12 in above script (landuse and rate section).

Share the script you come up with.  The next steps would be to read the text file, split each line where there are spaces, use the data to create a tree class, and print the results.

CNRFGN
by
New Contributor II

class Tree:

    def __init__(self, block, plot, species, dbh):

        self.block = block

        self.plot=plot

        self.species=species

        self.dbh=dbh    

    def dib(self):

    dib = self.dbh * 1/1.09

        return dib

0 Kudos
RandyBurton
MVP Alum

Your tree class looks good, with one possible exception.  The next to last line appears to need indentation.  When sharing Python scripts, it is good to use the "syntax highlighter" when posting to GeoNet.  There are some good instructions on using the highlighter here: Code Formatting... the basics++ Here is what your code looks like using the highlighter with the indentation corrected:

class Tree:
    def __init__(self, block, plot, species, dbh):
        self.block = block
        self.plot=plot
        self.species=species
        self.dbh=dbh    

    def dib(self):
        dib = self.dbh * (1/1.09) # 1/1.09 = 0.917431193
        return dib
‍‍‍‍‍‍‍‍‍‍

Also in line 9, I added some parenthesis around the 1/1.09.  I don't think it matters in this case, but it insures the division happens before the multiplication.  You could also use the 0.91743 equivalent.

For the next step, you will need some code to read your text file.  Here's a basic approach.  It assumes the text file does not have a header.

filename = r"C:\Path\to\trees.txt" # enter full path and filename
tf = open(filename, 'r')

treeData = tf.readlines()

for row in treeData:
    td = row.strip().split() # strip any line feeds, then split on spaces
    print td

tf.close()

I created a simple tree data file, and the script prints out:

['1', '1', 'cedar', '4.5']
['1', '2', 'spruce', '3.75']
['2', '1', 'hemlock', '2.5']

Note that a list is produced and all the elements are text (in quotes).  It is possible that the Block and Plot will be text, but they could be numbers.  The DBH data is probably a floating point number, so you will need to change it from type text to float.  The next steps are to include the tree class and print the results.  This should be similar to your parcels  example.

You may need to deal with a header row when reading your text file.  If you were wanting to number each tree by row in the file, you will need a counter.

Let me know how this part goes.

CNRFGN
by
New Contributor II

thank you i think from this i can handle it. i appreciate it.