首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用pyshp创建一个直线段的shapefile?

用pyshp创建一个直线段的shapefile?
EN

Stack Overflow用户
提问于 2017-08-22 14:33:50
回答 2查看 936关注 0票数 1

使用Python和比什普库,我试图从下面的数据(存储在列表中)创建一个shapefile:

代码语言:javascript
复制
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 ):

代码语言:javascript
复制
w = shapefile.Writer()
w.line(parts=[edge_list])
w.field("COMMON_ID", 'C')
w.save("test")

我明白了:

但我想得到这个:

有什么暗示吗?

编辑:这是完整的测试代码,但没有太多内容。文件"temp.csv“只包含上面所示的两列点,用逗号分隔,并为头(x,y)增加一行。

代码语言:javascript
复制
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")
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-22 14:43:42

免责声明:我没有使用shapefile或pyshp。但我对画线很在行。

我看到的是,它是按照你输入点的顺序画线的。它把点连在一起,这就是给你的点的顺序。您需要做的是重新排序在edge_list中的点。

在你的例子中,如果你的y变量是有序的,你的点看起来会很好。

所以,试着替换这一行:

代码语言:javascript
复制
w.line(parts=[edge_list])

在这方面:

代码语言:javascript
复制
w.line(parts=sorted(edge_list, key=lambda point: point[1]))

这将按y-变量对你的点进行排序,并按照你想要的方式画出一条线。

票数 2
EN

Stack Overflow用户

发布于 2017-08-22 20:37:07

将列表传递给shapefile.line()之前,我只是简单地对列表进行排序,从而得到了一个解决方案。

以下是完整的、完全工作的代码:

代码语言:javascript
复制
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")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45820547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档