Создание шейп-файла из прямых сегментов с помощью pyshp?
Используя Python и библиотеку pyshp, я пытаюсь создать шейп-файл из данных ниже (хранящихся в списке):
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")
2 ответа
Отказ от ответственности: я не использовал шейп-файлы или 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")