【发布时间】:2014-05-06 22:56:40
【问题描述】:
我正在尝试在 python 中创建一个脚本,以确定点是否位于用户指定四个角的多边形内部或外部,然后计算每个类别中有多少个。到目前为止,我的代码看起来像这样,这是我从 Ray Casting Method 中采用的:
import csv
def point_in_polygon(x,y,poly):
n = len(poly)
inside = False
point_x1,point_y1 = poly[0]
for i in range(n+1):
point_x2,point_y2 = poly[i % n]
if y > min(point_y1,point_y2):
if y <= max(point_y1,point_y2):
if x <= max(point_x1,point_x2):
if point_y1 != point_y2:
xints = (y-point_y1)*(point_x2 - point_x1)/(point_y2-point_y1)+point_x1
if point_x1 == point_x2 or x <= xints:
inside = not inside
point_x1,point_y1= point_x2,point_y2
return inside
def a_reader():
a_reader = open(r'datasmall.csv', 'rU')
a_csv_reader = csv.reader(a_reader)
a_csv_reader.next()
numRecords = sum(1 for line in open('datasmall.csv'))
print (numRecords - 1, "<-- This is the number of stations")
for row in a_csv_reader:
return row
a_reader.close()
a_reader()
## Input goes here. Will update all inputs after running properly
def main():
x1 = input('What is X1?')
y1 = input('What is Y1?')
polygon = [(x1,y1),(10,10),(10,0),(0,0)]
for row in a_reader:
print point_in_polygon(float(row[1]), float(row[2]),polygon,)
main()
当分解成存根时,所有单独的部分都可以工作。我的问题是当我尝试使用带有坐标列表的 CSV 文件来查看它们是否落在多边形内并且 CSV 文件中的值没有被转换为浮点数时。我收到的错误是这样的
Traceback (most recent call last):
File "C:\Python27\Lib\site-packages\Pythonwin\pywin\framework\scriptutils.py", line 323, in RunScript
debugger.run(codeObject, __main__.__dict__, start_stepping=0)
File "C:\Python27\Lib\site-packages\Pythonwin\pywin\debugger\__init__.py", line 60, in run
_GetCurrentDebugger().run(cmd, globals,locals, start_stepping)
File "C:\Python27\Lib\site-packages\Pythonwin\pywin\debugger\debugger.py", line 655, in run
exec cmd in globals, locals
File "E:\spatial\Project\xy_input_list.py", line 16, in <module>
import csv
File "E:\spatial\Project\xy_input_list.py", line 62, in main
for row in a_reader:
TypeError: 'function' object is not iterable
现在这是否意味着在 main() 中它无法将 CSV 文件中的值传递给 point_in_polygon 函数?
我一直在练习的 CSV 文件就是这样,因为我希望使用的文件有更多的价值:
ID,Easting,Northing
1,10,10
2,1,2
3,5,5
4,6,3
5,4,0
6,4,9
7,0,0
我已经设法让 float 方法在其他程序中工作,但我想知道我在光线投射中是否缺少某些东西,导致它们以某种方式发生冲突。任何帮助将不胜感激。
【问题讨论】:
-
@jonrsharpe 的另一个快速问题肯定有帮助,程序运行完全符合我的期望:在我使用
yield并在a_reader中使用return之前,我可以如果文件对程序不可用,则显示except IOError的行。有没有不同的方法可以写这个来使用yield? -
想通了 :D 感谢你们的帮助