Попытка построить географический файл формы c для Великобритании в python - PullRequest
0 голосов
/ 29 апреля 2020

Я пытался установить Geo python на 3.7, Fiona / GDAL с треском провалилась при установке. Затем я только что попытался запросить файл с помощью считывателя фигур и напрямую отобразить точки.

Хотя у меня был некоторый успех с примером на gis.StackOverflow (кредит пользователю 681), я использовал шейп-файл с сайта правительства Великобритании. Когда я строю границы, я получаю ужасную точечную корреляцию.

enter image description here

Мой код здесь.

import matplotlib.pyplot as plt
import numpy as np
import shapefile   

ukmap = shapefile.Reader("./Archive/UK_map.shp")

txt_shapes = []
for ukmapshape in ukmap.shapes(): 
    listx=[]
    listy=[]   
    for x,y in ukmapshape.points:
        listx.append(x)
        listy.append(y)
    txt_shapes.append([listx,listy])

for zone in txt_shapes:
    x,y = zone
    plt.plot(x,y)
plt.axis('equal')
plt.show()

Вопрос в том, вероятно ли это порядок точек, или мой метод неверен?

http://geoportal.statistics.gov.uk/datasets/nuts-level-1-january-2018-ultra-generalised-clipped-boundaries-in-the-united-kingdom

1 Ответ

1 голос
/ 29 апреля 2020

Вы должны были рассмотреть части формы, которые содержат конечные индексы каждой части / начальный индекс следующей части. Вот что у меня сработало:

import matplotlib.pyplot as plt
import numpy as np
import shapefile   

ukmap = shapefile.Reader("./Archive/UK_map.shp")

txt_shapes = []
for ukmapshape in ukmap.shapeRecords(): 
    listx=[]
    listy=[]
    # parts contains end index of each shape part
    parts_endidx = ukmapshape.shape.parts.tolist()
    parts_endidx.append(len(ukmapshape.shape.points) - 1)
    for i in range(len(ukmapshape.shape.points)):
        x, y = ukmapshape.shape.points[i]
        if i in parts_endidx:
            # we reached end of part/start new part
            txt_shapes.append([listx,listy])
            listx = [x]
            listy = [y]
        else:
            # not end of part
            listx.append(x)
            listy.append(y)

for zone in txt_shapes:
    x,y = zone
    plt.plot(x,y)
plt.axis('equal')
plt.show()

enter image description here

...