-
Notifications
You must be signed in to change notification settings - Fork 157
/
maskout.py
57 lines (53 loc) · 2.73 KB
/
maskout.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# -*- coding: utf-8 -*-
########################################################################################################################
# ### This module enables you to maskout the unneccessary data outside the
# interest region on a matplotlib-plotted output instance
# ################### in an effecient way,You can use this script for free ###########################################
# ######################################################################################################################
# ####USAGE:INPUT include 'originfig':the matplotlib instance##
# 'ax': the Axes instance
# 'shapefile': the shape file used for generating a basemap A
# 'region':the name of a region of on the basemap A,outside the region the data is to be maskout
# OUTPUT is 'clip' :the the masked-out or clipped matplotlib instance.
import shapefile
from matplotlib.path import Path
from matplotlib.patches import PathPatch
def getPathFromShp(shpfile, region, encoding="utf-8"):
try:
sf = shapefile.Reader(shpfile, encoding=encoding)
vertices = [] # 这块是已经修改的地方
codes = [] # 这块是已经修改的地方
paths = []
for shape_rec in sf.shapeRecords():
# if shape_rec.record[3] == region: # 这里需要找到和region匹配的唯一标识符,record[]中必有一项是对应的。
if region == [100000] or shape_rec.record[4] in region: # 这块是已经修改的地方
pts = shape_rec.shape.points
prt = list(shape_rec.shape.parts) + [len(pts)]
for i in range(len(prt) - 1):
for j in range(prt[i], prt[i + 1]):
vertices.append((pts[j][0], pts[j][1]))
codes += [Path.MOVETO]
codes += [Path.LINETO] * (prt[i + 1] - prt[i] - 2)
codes += [Path.CLOSEPOLY]
path = Path(vertices, codes)
paths.append(path)
if paths:
path = Path.make_compound_path(*paths)
else:
path = None
return path
except Exception as err:
print(err)
return None
def shp2clip(originfig, ax, shpfile, region, encoding=None):
if encoding is None:
encoding = "utf-8"
path = getPathFromShp(shpfile=shpfile, region=region, encoding=encoding)
patch = None
if path:
patch = PathPatch(
path, transform=ax.transData, facecolor="none", edgecolor="black"
)
for contour in originfig.collections:
contour.set_clip_path(patch)
return path, patch