Создание шейп-файла из прямых сегментов с помощью 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")
Другие вопросы по тегам