【问题标题】:Using python to find points in a user designated polygon使用python在用户指定的多边形中查找点
【发布时间】: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 感谢你们的帮助

标签: python csv polygon


【解决方案1】:

看来你需要改变

for row in a_reader:
...

for row in a_reader():
...

【讨论】:

  • Welcome =) 顺便说一句,它直接指向trace:for row in a_reader: TypeError: 'function' object is not iterable
  • 对不起,谢谢之前我已经回复了,我不知道发生了什么。但是谢谢 :) 所以如果它指向一个跟踪,这意味着没有 () 并且它无法运行?
  • trace 说,a_reader 是一个函数,所以它是不可迭代的。在我看来,尝试调用这个函数是一个非常直接的提示
【解决方案2】:

您需要调用 a_reader 以获取它返回的row

for row in a_reader():
                 # ^ note parentheses

此外,该功能可以改进 - close 永远不会显式运行,因为它在 return 之后,您应该在每一行 yield 而不仅仅是 returning第一个:

def a_reader(filename="datasmall.csv"):
    with open(filename) as f:
        numRecords = sum(1 for line in f)
    print("{0} <-- This is the number of stations".format(numRecords-1))
    with open(filename) as reader:
        csv_reader = csv.reader(reader)
        csv_reader.next()
        for row in csv_reader:
            yield row

【讨论】:

  • 好的,我已经按原样插入了它,但它应该是顶部的 a_csv_reader 还是底部的 a_reader?否则我会让它们没有被全局定义。
  • @MattButton 抱歉,复制粘贴和编辑错误。固定!
  • 成功了!!太好了 :D :D 非常感谢 :) 还有一种方法可以告诉我有多少电台返回真假?
  • @MattButton 当然,创建count = 0 然后当你循环for row in a_reader(): if point_in_polygon(...): count += 1
  • 好的,所以我必须将其添加到错误的位置,或者......因为现在我没有得到任何真假返回,只有“这是站数”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-01
  • 2019-04-21
相关资源
最近更新 更多