使用 pyshp 创建直线段的 shapefile?
Creating a shapefile of straight segments with pyshp?
使用 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" 只包含上面显示的两列点,用逗号分隔,并为 headers (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")
免责声明:我没有使用过 shapefile 或 pyshp。但我知道画线的方法。
我看到的是它按照您输入点的顺序绘制线条。它连接点,这就是你的点的顺序。您需要做的是重新排序 edge_list
.
中的点
在你的例子中,如果你的 y 变量是有序的,你的点看起来会很好。
因此,请尝试替换此行:
w.line(parts=[edge_list])
有了这个:
w.line(parts=sorted(edge_list, key=lambda point: point[1]))
这将按 y 变量对您的点进行排序,并且应该按照您想要的方式画线。
我通过在将列表传递给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")
使用 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" 只包含上面显示的两列点,用逗号分隔,并为 headers (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")
免责声明:我没有使用过 shapefile 或 pyshp。但我知道画线的方法。
我看到的是它按照您输入点的顺序绘制线条。它连接点,这就是你的点的顺序。您需要做的是重新排序 edge_list
.
在你的例子中,如果你的 y 变量是有序的,你的点看起来会很好。
因此,请尝试替换此行:
w.line(parts=[edge_list])
有了这个:
w.line(parts=sorted(edge_list, key=lambda point: point[1]))
这将按 y 变量对您的点进行排序,并且应该按照您想要的方式画线。
我通过在将列表传递给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")