2017-02-08 9 views
1

базовой картой Я пытаюсь прочитать границу с канадской карте от here«UTF-8» не может декодировать при использовании readshapefile на питона

import matplotlib.pyplot as plt 
import matplotlib.cm 

from mpl_toolkits.basemap import Basemap 
from matplotlib.patches import Polygon 
from matplotlib.collections import PatchCollection 
from matplotlib.colors import Normalize 

m = Basemap(resolution='c', # c, l, i, h, f or None 
      projection='merc', 
      lat_0=56.1304, lon_0=106.3468, 
      llcrnrlon=-141.0, llcrnrlat= 41.2, urcrnrlon=-52.3, urcrnrlat=69.8) 

m.drawmapboundary(fill_color='#46bcec') 
m.fillcontinents(color='#f2f2f2',lake_color='#46bcec') 
m.drawcoastlines() 

, пока здесь все не работает, но когда я пытаюсь добавить граница,

m.readshapefile('mypaths/gcma000b11a_e/gcma000b11a_e', 'gcma000b11a_e') 

у меня есть эта ошибка: utf-8

код из этого великого tutorial

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 11: invalid continuation byte 
+0

Является ли шейп-файл текстовым файлом utf-8 с конечным кодом? Если это не текстовый файл, вам нужно открыть файл с использованием двоичного режима ('rb'), чтобы избежать попыток Python декодировать Unicode. Если это текстовый файл, но не закодированный utf-8, вам нужно открыть его с помощью правильного кодека. – cco

+0

это не текстовый файл, шейп-файл - .shp – enden

ответ

1

Файл формы, который вы связали, фактически состоит из 4 файлов (.dbf, .prj, .shp, .shx). Проблема заключается в файле dbf (gcma000b11a_e.dbf), который не находится в utf-8. Он содержит французских символов (например, é). Вы должны преобразовать этот файл в utf-8, тогда ваш код работает. Простым способом преобразования файла .dbf является его открытие с помощью libre office calc, а в диалоговом окне импорта выберите «Unicode (UTF-8)». Сохраните файл, и файл m.readshape будет работать.