1

使用 Python 和pyshp库,我正在尝试从以下数据(存储在列表中)创建一个 shapefile:

edge_list = [
    [-40.5, -20.666],
    [-39.849998, -18.700001],
    [-39.816002, -19.6],
    [-40.071999, -19.391001],
    [-40.150002, -19.933001],
    [-39.733002, -18.533001],
    [-39.833, -18.733],
    [-39.708, -18.419001],
    [-39.370998, -17.891001],
    [-39.200001, -17.417],
    [-39.216999, -17.299999],
    [-39.167, -17.083],
    [-39.049999, -16.433001],
    [-38.932999, -13.967],
    [-39.083, -16.583],
    [-39.0, -13.916],
    [-38.900002, -13.6],
]

这是我的一段代码(其中 edge_list 是上面的列表):

w = shapefile.Writer()
w.line(parts=[edge_list])
w.field("COMMON_ID", 'C')
w.save("test")

我明白了:

在此处输入图像描述

但我想得到这个:

在此处输入图像描述

有什么提示吗?

编辑:这是完整的测试代码,但内容不多。文件“temp.csv”只包含上面显示的两列点,用逗号分隔,并带有一个额外的标题行(x,y)。

import csv
import shapefile

data = csv.reader(open("test.csv", "rb"), delimiter = ',')
data.next() # skip header line
edge_list = []
for row in data:
    edge_list.append([float(row[0]), float(row[1])])

for e in range(len(edge_list)):
    print "x=", edge_list[e][0], "y=", edge_list[e][1]

w = shapefile.Writer()
w.line(parts=[edge_list])
w.field("COMMON_ID", 'C')
w.save("test")
4

2 回答 2

1

我通过在将列表传递给 shapefile.line()之前简单地对列表进行排序得到了解决方案。

这是完整的,完全工作的代码:

import csv
import shapefile

data = csv.reader(open("test.csv", "rb"), delimiter = ',')
data.next() # skip header line
edge_list = []
for row in data:
    edge_list.append([float(row[0]), float(row[1])])

## sort list before passing it to shapefile.line function
edge_list = list(sorted(edge_list, key=lambda point: point[1]))

for e in range(len(edge_list)):
    print "x=", edge_list[e][0], "y=", edge_list[e][1]

w = shapefile.Writer()
w.line(parts=[edge_list]) ## this now works OK!
w.field("COMMON_ID", 'C')
w.save("test")
于 2017-08-22T20:37:07.453 回答
1

免责声明:我没有使用过 shapefile 或 pyshp。但我知道画线的方法。

我看到的是它按照您输入点的顺序绘制线条。它连接点,这就是你的点的顺序。您需要做的是重新排序edge_list.

在您的情况下,如果订购了 y 变量,您的点会看起来不错。

所以,尝试替换这一行:

w.line(parts=[edge_list])

有了这个:

w.line(parts=sorted(edge_list, key=lambda point: point[1]))

这将按 y 变量对您的点进行排序,并且应该按照您想要的方式绘制线条。

于 2017-08-22T14:43:42.030 回答