<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Creating a Line at a Right Angle to another line? in Python Questions</title>
    <link>https://community.esri.com/t5/python-questions/creating-a-line-at-a-right-angle-to-another-line/m-p/118469#M9323</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Sorry to sound a little ignorant, just getting into the Python world, but what is Mathlib and how is it accessed?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Regards&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 22 Feb 2012 14:51:47 GMT</pubDate>
    <dc:creator>FrederiqueLemieux</dc:creator>
    <dc:date>2012-02-22T14:51:47Z</dc:date>
    <item>
      <title>Creating a Line at a Right Angle to another line?</title>
      <link>https://community.esri.com/t5/python-questions/creating-a-line-at-a-right-angle-to-another-line/m-p/118467#M9321</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Hello,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I have a shapefile which contains many lines features.&amp;nbsp; I would like to create a python script that will create a line and the start and end of each line, at a right angle, and a set length.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I know it will require a little trig calculations which I am happy with, but I would need to get information about the line, i.e. the cooridinates of the start and end point, the angle of the line from those points (I'm not sure how information about line shapefiles are stored)....&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;And then from that information create a line using python script.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Could someone point me in the right direction on how I would do this?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Thanks in advance.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 22 Feb 2012 11:57:03 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/creating-a-line-at-a-right-angle-to-another-line/m-p/118467#M9321</guid>
      <dc:creator>FrederiqueLemieux</dc:creator>
      <dc:date>2012-02-22T11:57:03Z</dc:date>
    </item>
    <item>
      <title>Re: Creating a Line at a Right Angle to another line?</title>
      <link>https://community.esri.com/t5/python-questions/creating-a-line-at-a-right-angle-to-another-line/m-p/118468#M9322</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;BLOCKQUOTE class="jive-quote"&gt;&lt;BR /&gt;Could someone point me in the right direction on how I would do this? &lt;/BLOCKQUOTE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;You can read geometry and create features using cursors. It's a little tricky (and slow) but it can be done.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Here's the help on that: &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;A href="&amp;lt;/span&amp;gt;&amp;lt;a" target="_blank"&gt;Arc" rel="nofollow" target="_blank"&amp;gt;http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//002z0000001s000000]Arc&lt;/A&gt;&lt;SPAN&gt; 10 Help: Working with geometry in Python&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Be sure and avoid doing all the geometry yourself, there are some very handy functions in the standard library, especially math.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Field Calculator supports a lot of calculations too - if you want store things in the attribute table:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;[post=169592]Common Python geometry calculations in the Field Calculator [/post]&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 22 Feb 2012 14:10:06 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/creating-a-line-at-a-right-angle-to-another-line/m-p/118468#M9322</guid>
      <dc:creator>curtvprice</dc:creator>
      <dc:date>2012-02-22T14:10:06Z</dc:date>
    </item>
    <item>
      <title>Re: Creating a Line at a Right Angle to another line?</title>
      <link>https://community.esri.com/t5/python-questions/creating-a-line-at-a-right-angle-to-another-line/m-p/118469#M9323</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Sorry to sound a little ignorant, just getting into the Python world, but what is Mathlib and how is it accessed?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Regards&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 22 Feb 2012 14:51:47 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/creating-a-line-at-a-right-angle-to-another-line/m-p/118469#M9323</guid>
      <dc:creator>FrederiqueLemieux</dc:creator>
      <dc:date>2012-02-22T14:51:47Z</dc:date>
    </item>
    <item>
      <title>Re: Creating a Line at a Right Angle to another line?</title>
      <link>https://community.esri.com/t5/python-questions/creating-a-line-at-a-right-angle-to-another-line/m-p/118470#M9324</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;A href="http://docs.python.org/library/math.html#module-math" rel="nofollow noopener noreferrer" target="_blank"&gt;math&lt;/A&gt;&lt;SPAN&gt; (sorry) is a module that is part of the standard library, ie it's in all python distributions.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;&amp;gt;&amp;gt;&amp;gt; import math
&amp;gt;&amp;gt;&amp;gt; help(math) &lt;/PRE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;If you're new to Python, be sure and check out:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;A href="&amp;lt;/span&amp;gt;&amp;lt;a" target="_blank" rel="nofollow noopener noreferrer"&gt;Brief" rel="nofollow" target="_blank"&amp;gt;http://docs.python.org/tutorial/stdlib.html]Brief&lt;/A&gt;&lt;SPAN&gt; Tour of the Standard Library&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sat, 11 Dec 2021 06:56:34 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/creating-a-line-at-a-right-angle-to-another-line/m-p/118470#M9324</guid>
      <dc:creator>curtvprice</dc:creator>
      <dc:date>2021-12-11T06:56:34Z</dc:date>
    </item>
    <item>
      <title>Re: Creating a Line at a Right Angle to another line?</title>
      <link>https://community.esri.com/t5/python-questions/creating-a-line-at-a-right-angle-to-another-line/m-p/118471#M9325</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Here is a similar problem I had a long time ago. I needed to draw a right angled line across the road at each drain (cunvert) point that was recorded in an asset management system. ArcIMS could not handle linear referencing. I got the angles by using MakeRouteEventLayer, then it was just a matter of creating a new line.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;It could be a lot more elegant at 10.x but the maths is the same. I wrote out to a file and used the sample/CreateFeaturesFromTextFile, now deprecated and removed.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;
# culvert.py
# create culvert lines from point events
# must have loc_angle and length_m fields
# default length_m is 10 metres
# angle is from event wizard which is parallel to road
# which must be wrong at 9.1
# Input
# arg1 point event layer
# arg2 loc_angle field
# arg3 length_m field
# arg4 output featureclass
# projection from event layer
# Kim Ollivier
# 26 September 2006

import sys, string, os, win32com.client, math

def newculvert(strID,strX,strY,strAngle,strSize) :
&amp;nbsp;&amp;nbsp;&amp;nbsp; """
&amp;nbsp;&amp;nbsp;&amp;nbsp; Create a line array at right angles to angle
&amp;nbsp;&amp;nbsp;&amp;nbsp; and add to new featureclass already defined
&amp;nbsp;&amp;nbsp;&amp;nbsp; """
&amp;nbsp;&amp;nbsp;&amp;nbsp; id = int(strID)
&amp;nbsp;&amp;nbsp;&amp;nbsp; x0 = float(strX)
&amp;nbsp;&amp;nbsp;&amp;nbsp; y0 = float(strY)
&amp;nbsp;&amp;nbsp;&amp;nbsp; radAngle = float(strAngle) / 180.0 * 3.14159
&amp;nbsp;&amp;nbsp;&amp;nbsp; size = float(strSize) / 2.0
&amp;nbsp;&amp;nbsp;&amp;nbsp; if size == 0 :
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; size = 10
&amp;nbsp;&amp;nbsp;&amp;nbsp; x1 = x0 - size * math.cos(radAngle)
&amp;nbsp;&amp;nbsp;&amp;nbsp; y1 = y0 - size * math.sin(radAngle)
&amp;nbsp;&amp;nbsp;&amp;nbsp; x2 = x0 + size * math.cos(radAngle)
&amp;nbsp;&amp;nbsp;&amp;nbsp; y2 = y0 + size * math.sin(radAngle)
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; # print "%8d %12.3f %12.3f %8.3f %4.1f" % (id,x0,y0,angle,size)
&amp;nbsp;&amp;nbsp;&amp;nbsp; # print "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %12.3f %12.3f %12.3f %12.3f" % (dx1,dy1,dx2,dy2)
&amp;nbsp;&amp;nbsp;&amp;nbsp; print &amp;gt;&amp;gt; f1,"%d 0" % id
&amp;nbsp;&amp;nbsp;&amp;nbsp; print &amp;gt;&amp;gt; f1,"0 %f %f 0.0 0.0" % (x1,y1)
&amp;nbsp;&amp;nbsp;&amp;nbsp; print &amp;gt;&amp;gt; f1,"1 %f %f 0.0 0.0" % (x2,y2)
&amp;nbsp;&amp;nbsp;&amp;nbsp; return True
#----------------- main -----------------

gp = win32com.client.Dispatch("esriGeoprocessing.GpDispatch.1")

if len(sys.argv) != 6 :
&amp;nbsp;&amp;nbsp;&amp;nbsp; print "Need 6 parameters, setting defaults for debugging"
&amp;nbsp;&amp;nbsp;&amp;nbsp; strInputFeatureClass = "e:/council/clutha/shape/culvert3.shp"
&amp;nbsp;&amp;nbsp;&amp;nbsp; strIDField = "DRAIN_ID"
&amp;nbsp;&amp;nbsp;&amp;nbsp; strAngleField = "LOC_ANGLE"
&amp;nbsp;&amp;nbsp;&amp;nbsp; strSizeField = "LENGTH_M"
&amp;nbsp;&amp;nbsp;&amp;nbsp; strOutputFeatureClass = "e:/council/clutha/shape/culvert_ln.shp"
else :
&amp;nbsp;&amp;nbsp;&amp;nbsp; strInputFeatureClass = sys.argv[1]
&amp;nbsp;&amp;nbsp;&amp;nbsp; strIDField = sys.argv[2]
&amp;nbsp;&amp;nbsp;&amp;nbsp; strAngleField = sys.argv[3]
&amp;nbsp;&amp;nbsp;&amp;nbsp; strSizeField = sys.argv[4]
&amp;nbsp;&amp;nbsp;&amp;nbsp; strOutputFeatureClass = sys.argv[5]

if not os.path.exists(strInputFeatureClass) :
&amp;nbsp;&amp;nbsp;&amp;nbsp; print strInputFeatureClass,"not found"
&amp;nbsp;&amp;nbsp;&amp;nbsp; sys.exit()

# set the directory and workspace to the source shapefile location

os.chdir(os.path.dirname(strInputFeatureClass))
gp.Workspace = os.path.dirname(strInputFeatureClass)
f1 = open("culvert.txt","w")
print &amp;gt;&amp;gt; f1,"Polyline"

# Find the name of the shape field using Describe.
strShapeFieldName = gp.Describe(strInputFeatureClass).ShapeFieldName
# Check other fields are correct
eFlds = gp.ListFields(strInputFeatureClass)
fld = eFlds.Next()
fldOk = False
print gp.GetCount_management(strInputFeatureClass),"gp count"

while fld :
&amp;nbsp;&amp;nbsp;&amp;nbsp; if fld.Name.upper() == strIDField.upper() :
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fldIDOk = True
&amp;nbsp;&amp;nbsp;&amp;nbsp; if fld.Name.upper() == strAngleField.upper() :
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fldAngleOk = True
&amp;nbsp;&amp;nbsp;&amp;nbsp; if fld.Name.upper() == strSizeField.upper() :
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fldSizeOk = True
&amp;nbsp;&amp;nbsp;&amp;nbsp; fld = eFlds.Next()
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
if not fldIDOk:
&amp;nbsp;&amp;nbsp;&amp;nbsp; strErr = "No ID field found "+strIDField
&amp;nbsp;&amp;nbsp;&amp;nbsp; gp.AddError(strErr)
&amp;nbsp;&amp;nbsp;&amp;nbsp; print strErr
else :
&amp;nbsp;&amp;nbsp;&amp;nbsp; print strIDField," found"
if not fldAngleOk:
&amp;nbsp;&amp;nbsp;&amp;nbsp; strErr = "No Angle field found "+strAngleField
&amp;nbsp;&amp;nbsp;&amp;nbsp; gp.AddError(strErr)
&amp;nbsp;&amp;nbsp;&amp;nbsp; print strErr
else :
&amp;nbsp;&amp;nbsp;&amp;nbsp; print strAngleField," found"
if not fldSizeOk:
&amp;nbsp;&amp;nbsp;&amp;nbsp; strErr = "No Size field found "+strSizeField
&amp;nbsp;&amp;nbsp;&amp;nbsp; gp.AddError(strErr)
&amp;nbsp;&amp;nbsp;&amp;nbsp; print strErr
else :
&amp;nbsp;&amp;nbsp;&amp;nbsp; print strSizeField," found"

if not (fldIDOk or fldAngleOk or fldSizeOk) :
&amp;nbsp;&amp;nbsp;&amp;nbsp; print "Fatal error in field names"
&amp;nbsp;&amp;nbsp;&amp;nbsp; sys.exit(2)
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
nCulvert = 0
# open a Search Cursor
objRowList = gp.SearchCursor(strInputFeatureClass)
objRow = objRowList.Next()
# 
try :
&amp;nbsp;&amp;nbsp;&amp;nbsp; while objRow:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; objGeometry = objRow.GetValue(strShapeFieldName)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; objPart = objGeometry.GetPart(0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strX = objPart.X
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strY = objPart.Y
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strID = objRow.getValue(strIDField)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strAngle = objRow.GetValue(strAngleField)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strSize = objRow.GetValue(strSizeField)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # create a new line feature
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ok = newculvert(strID,strX,strY,strAngle,strSize)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ok :
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nCulvert += 1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # cleanup or looks like a memory leak
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; del objRow, objPart, objGeometry
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRow = objRowList.Next()
except Exception, e :
&amp;nbsp;&amp;nbsp;&amp;nbsp; print e
&amp;nbsp;&amp;nbsp;&amp;nbsp; gp.AddError(e)
&amp;nbsp;&amp;nbsp;&amp;nbsp; del objRow, objPart, objGeometry
&amp;nbsp;&amp;nbsp;&amp;nbsp; print "Error in Search Cursor"
&amp;nbsp;&amp;nbsp;&amp;nbsp; print gp.GetMessages()
&amp;nbsp;&amp;nbsp;&amp;nbsp; gp.AddError("Error in Search Cursor")
&amp;nbsp;&amp;nbsp;&amp;nbsp; sys.exit(2)

print &amp;gt;&amp;gt; f1,"END"
f1.close()

print nCulvert,"culverts total"
gp.AddMessage(str(nCulvert)+" culverts found")

# create a shapefile
gp.OverwriteOutput = 1
test = "culvert_ln.shp"
gp.CreateFeaturesFromTextFile("culvert.txt",".",test,"")
print "Created new shapefile",test
#==================================================

&lt;/PRE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sat, 11 Dec 2021 06:56:36 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/creating-a-line-at-a-right-angle-to-another-line/m-p/118471#M9325</guid>
      <dc:creator>KimOllivier</dc:creator>
      <dc:date>2021-12-11T06:56:36Z</dc:date>
    </item>
    <item>
      <title>Re: Creating a Line at a Right Angle to another line?</title>
      <link>https://community.esri.com/t5/python-questions/creating-a-line-at-a-right-angle-to-another-line/m-p/118472#M9326</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Thanks! I'll give this a go this week.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Will let you know how I get on.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Thanks&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 27 Feb 2012 15:00:51 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/creating-a-line-at-a-right-angle-to-another-line/m-p/118472#M9326</guid>
      <dc:creator>FrederiqueLemieux</dc:creator>
      <dc:date>2012-02-27T15:00:51Z</dc:date>
    </item>
  </channel>
</rss>

