From cc1232ac8426208c135bbeeca0c9a0b1a2960645 Mon Sep 17 00:00:00 2001 From: Wentao Li Date: Thu, 11 Aug 2022 20:53:13 +0800 Subject: [PATCH] 1.1.* : update (#68) --- cnmaps/__init__.py | 3 + cnmaps/drawing.py | 107 ++++++---------------- cnmaps/maps.py | 11 ++- cnmaps/sample.py | 13 +-- docs/source/_static/clip-china-quiver.png | Bin 0 -> 73338 bytes docs/source/content/api-ref.rst | 5 +- docs/source/content/usage.rst | 36 ++++++++ requirements.txt | 2 +- tests/test_drawing.py | 69 +++++++++++--- tests/test_geo.py | 30 ++++++ tests/test_map.py | 39 ++++++++ 11 files changed, 203 insertions(+), 112 deletions(-) create mode 100644 docs/source/_static/clip-china-quiver.png create mode 100644 tests/test_geo.py diff --git a/cnmaps/__init__.py b/cnmaps/__init__.py index 1ddffdd..2bcd581 100644 --- a/cnmaps/__init__.py +++ b/cnmaps/__init__.py @@ -5,6 +5,7 @@ import warnings import cartopy +from shapely.errors import ShapelyDeprecationWarning from .maps import * # noqa: F403, F401 from .drawing import * # noqa: F403, F401 @@ -15,6 +16,8 @@ if CARTOPY_DIGIT_VERSION < "0.20.0": warnings.warn(("由于Cartopy的版本低于0.20.0, 请将Cartopy的版本升级到0.20.0及以上.")) +warnings.filterwarnings("ignore", category=ShapelyDeprecationWarning) + BASE_DIR = os.path.dirname(os.path.abspath(__file__)) BASE_DATA_DIR = os.path.join(BASE_DIR, "data", "geojson.min") diff --git a/cnmaps/drawing.py b/cnmaps/drawing.py index df69a97..918ce0f 100644 --- a/cnmaps/drawing.py +++ b/cnmaps/drawing.py @@ -19,55 +19,25 @@ def _make_clip_path(map_polygon): vertices = [] codes = [] - ax = plt.gca() clips = [] - crs = ccrs.PlateCarree() - transformer = Transformer.from_crs(crs, ax.projection, always_xy=True) + + ax = plt.gca() + crs_from = ccrs.PlateCarree() + crs_to = ax.projection + if crs_from != crs_to: + transformer = Transformer.from_crs(crs_from, crs_to, always_xy=True) + map_polygon = sops.transform(transformer.transform, map_polygon) for polygon in map_polygon.geoms: - try: - coords = polygon.boundary.coords - except NotImplementedError: - # 针对图形中出现了洞的情况的处理 - exterior_coords = polygon.exterior.coords - interiors = polygon.interiors - exterior_prt = len(exterior_coords) - for coord in exterior_coords: - try: - trans_coord = transformer.transform(*coord) - except AttributeError: - trans_coord = coord - vertices.append(trans_coord) - codes += [mpath.Path.MOVETO] - codes += [mpath.Path.LINETO] * (exterior_prt - 2) - codes += [mpath.Path.CLOSEPOLY] - for interior in interiors: - interior_coords = interior.coords - interior_prt = len(interior_coords) - for coord in interior_coords: - try: - trans_coord = transformer.transform(*coord) - except AttributeError: - trans_coord = coord - vertices.append(trans_coord) - codes += [mpath.Path.MOVETO] - codes += [mpath.Path.LINETO] * (interior_prt - 2) - codes += [mpath.Path.CLOSEPOLY] - - clip = mpath.Path(vertices, codes) - else: - prt = len(coords) - for coord in coords: - try: - trans_coord = transformer.transform(*coord) - except AttributeError: - trans_coord = coord - vertices.append(trans_coord) - codes += [mpath.Path.MOVETO] - codes += [mpath.Path.LINETO] * (prt - 2) - codes += [mpath.Path.CLOSEPOLY] - clip = mpath.Path(vertices, codes) - clip = mpatches.PathPatch(clip, transform=ax.transData) + coords = polygon.boundary.coords + prt = len(coords) + for coord in coords: + vertices.append(coord) + codes += [mpath.Path.MOVETO] + codes += [mpath.Path.LINETO] * (prt - 2) + codes += [mpath.Path.CLOSEPOLY] + _clip = mpath.Path(vertices, codes) + clip = mpatches.PathPatch(_clip, transform=ax.transData) clips.append(clip) @@ -273,47 +243,22 @@ def clip_clabels_by_map(clabel_text: matplotlib.text.Text, map_polygon: MapPolyg >>> draw_map(map_polygon, color='k') """ ax = plt.gca() - crs = ccrs.PlateCarree() - transformer = Transformer.from_crs(crs, ax.projection, always_xy=True) + crs_from = ccrs.PlateCarree() + crs_to = ax.projection + if crs_from != crs_to: + transformer = Transformer.from_crs(crs_from, crs_to, always_xy=True) + map_polygon = sops.transform(transformer.transform, map_polygon) for cbt in clabel_text: cbt.set_visible(False) for polygon in map_polygon.geoms: vertices = [] - try: - coords = polygon.boundary.coords - except NotImplementedError: - holes = [] - # 针对图形中出现了洞的情况的处理 - exterior_coords = polygon.exterior.coords - interiors = polygon.interiors - for coord in exterior_coords: - try: - trans_coord = transformer.transform(*coord) - except AttributeError: - trans_coord = coord - vertices.append(trans_coord) - for interior in interiors: - hole = [] - interior_coords = interior.coords - for coord in interior_coords: - try: - trans_coord = transformer.transform(*coord) - except AttributeError: - trans_coord = coord - hole.append(trans_coord) - holes.append(hole) - _polygon = sgeom.Polygon(vertices, holes=holes) - else: - for coord in coords: - try: - trans_coord = transformer.transform(*coord) - except AttributeError: - trans_coord = coord - vertices.append(trans_coord) - - _polygon = sgeom.Polygon(vertices) + coords = polygon.boundary.coords + for coord in coords: + vertices.append(coord) + + _polygon = sgeom.Polygon(vertices) for cbt in clabel_text: if _polygon.contains(sgeom.Point(cbt.get_position())): diff --git a/cnmaps/maps.py b/cnmaps/maps.py index 7b1f72c..aee57bf 100644 --- a/cnmaps/maps.py +++ b/cnmaps/maps.py @@ -61,7 +61,7 @@ def drop_inner_duplicate(map_polygon: sgeom.MultiPolygon): 返回值: MapPolygon: 清理后的地图边界对象 """ - polygons = list(map_polygon) + polygons = list(map_polygon.geoms) couples = [couple for couple in product(polygons, repeat=2)] for one, other in couples: @@ -178,15 +178,18 @@ def make_mask_array(self, lons: np.ndarray, lats: np.ndarray): 生成边界以外的遮罩(掩膜)数组 Args: - lons (np.ndarray): 经度矩阵 - lats (np.ndarray): 纬度矩阵 - data (np.ndarray): 数据矩阵 + lons (np.ndarray): 经度矩阵(2维) + lats (np.ndarray): 纬度矩阵(2维) Returns: np.ndarray: 遮罩(掩膜)数组 """ x = np.atleast_1d(lons) y = np.atleast_1d(lats) + + if len(x.shape) != 2 or len(y.shape) != 2: + raise ValueError("x或y不是2维数组") + if x.shape != y.shape: raise ValueError("x和y的形状不匹配") prepared = prep(self) diff --git a/cnmaps/sample.py b/cnmaps/sample.py index 518dd99..4e42279 100644 --- a/cnmaps/sample.py +++ b/cnmaps/sample.py @@ -9,27 +9,18 @@ BASE_DATA_DIR = os.path.join(BASE_DIR, "data", "sample") -def load_dem(area_name=None): +def load_dem(): """ 加载海拔高度样例数据 - 参数: - area_name (str, 可选): 区域名称, 若为None则取全国. 默认为 None. - 返回值: tuple: (lons, lats, data) """ - SUB_AREA = {"京津冀": np.s_[95:149, 207:259]} ds = nc.Dataset(os.path.join(BASE_DATA_DIR, "china-dem.nc")) lon = ds.variables["lon"][:] lat = ds.variables["lat"][:] lons, lats = np.meshgrid(lon, lat) - if area_name: - data = ds.variables["dem"][SUB_AREA[area_name]] - lons = lons[SUB_AREA[area_name]] - lats = lats[SUB_AREA[area_name]] - else: - data = ds.variables["dem"][:] + data = ds.variables["dem"][:] return lons, lats, data diff --git a/docs/source/_static/clip-china-quiver.png b/docs/source/_static/clip-china-quiver.png new file mode 100644 index 0000000000000000000000000000000000000000..458eee7a9898d5386371759727c749766a25ced7 GIT binary patch literal 73338 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%0A{nTkyl}2Dyz3Z#E*JWr0@7wr zw!d!Ed@lh0^1JmlTD3h*Jq-(28JasxZ@1v1$JLlIoo?8#tYZ$bx-a&PcgVlD@i+3J6CnLm0e!vbmAFdYXqS}|Lo`v|9F6cQqL za&mGTQ;7KXZSSWmm#ApU)Cu+BNrZIG_7U0{l)?dyG_EZG<82Lo-0qg=$mlA{#O4N0 z->6Qn()_`FRk!BBd~UcTe*VJ{iMG5|A(Ni#;v*_bGABq~iZYnaGWsX`Ue1MtN=1pv zovRf(0t4$Cc? zsT&hi782e5G4V*E{E3P5ur%VdZV@i&ck{|ZW2F)S*8cPsm#wgJnU34(U-q_%X3Y{E zZdW(Ai~SA)pM_9zLx>u~7sgKoX__1f`1F!#V64k8&mDcbz)ebyF*}*w3(fT-x5%=w zpaQA8qE4iy{um>%Zn1FrLmGuMJ&1K95oB9JN|->pJcK^Jzeb>{;+Y1l&Siag&hx*) zV#!2+3Kf}68p#C^ie3$%zU_e5TA`=dp=P5cxxLeB;n&Ko8yuT!Uhee^SYnol$vuB; zRi@Vz!Yg&#=I@uMlz`^FRaS2(nM7FrwaqOR91zQ(RrnK(u)7ur5Y^_?wOmbWG~{_p zdT9zzhTt?4xzb?L_yJ-f{ov_mDC~%QENa14vj%pQ@)-&u@a<|XE))*?Ykso_HBKC88t7 zel2Y}>mVUF2k(5I64A)Gy7CvOXY!2Mk+;8ofOKGa_AEqKKK9{!g3z1{@E>c9T8oDO z%lJl0nwgq!!)`)NFdhXxcAGZz(%#EeZcO{n1QU0rZnc*fUGuKY3*sWlHd;l~4MR6N z^p0d}vv(*_1YJw58Zp6H^m6{z#btlpOlHPQ-j zH2T)J)>k8D#9kW(cQ^Sh(!^YDfd$vE*1xdRWM5$eTf(0Uf`X$9)3$N*-z2rJi zu!Ldfa1MQohlFNDj7+XHve_t->j?%B0c)9gz!;)DyC~8lzbmv2)k*MpncAh{(XO|T zj?ktj4wuzRrrg%6k5+wT6$cUd1oEsDkFBWs3f^ShZ;e+Qx{;+?1G^$_70>pEe_E1^&w5lX3_N9nJWTGElAhSYdHA^6xz;$$DA z^!93MdjwP;)N})P8Hcl8+q2C{bg;cH)@NalU$p*r(#~$2 z(wth;S#6&tg09ZXD@x!K7x88H=B<*r%U6de2#Y{D|G<@abl{tY3rWCi?-GfhthRsR zFjZG@$3#$hm>DSSZ^|nQ`xMlT_jhB0oR?loz-RLBmOnv;aTk4W&l>VR?z+c>g%-by z&7Wza^3Ph|kIzj1lLS4<3263Ix$%84+w8^4&K{XuZTXahqC2gz^=LBJ>nRD<@1-Rx zLLZdFfT60ij_1o<`hc%_3OqrmS_fRf2vXU8Y_W0T%K{BZ z^^r23E-6%+4HLiVsVB*Lh^>q(JRMvlKys1|k&umLihZD>(V_d+`|9cREw}Dx0%1x~ z?mP}C6LZn-4`?mrplFMikgT8QV(rPd1dwqttrzNCT%UU_nNh{$67>CMW`8LlU# z7r|8AV)4%IysULMveL#+)(G}~T2&Z(`(6FAoR!ZwcMKKDN}Fg3dps(&&^9-_8YV{! zGe(Z1)GTN7xedj=utH^iC;t@KM2VnbVEt3QLc_-@76Qy#Y~v2z&f2_nqYG)r9^-xX zA=~!{9o~!*u6n|IUd_-K6!?a4|73NktLUQ9!2BBw^`TujgLiQ>@?x(&Q}1vG@$=_T zLOMs<2NL4q=RRA~9Ed-Z6$8pPw*wPZ1nnC8&oOfi%VMJq1xMi--N(F=(iNjmpX$a5 zSzRkSza|m!(RV$pT_xz75$6VF@)5SVTK>VFUeXgH<3>6qUZ?tSah1L74UA#bxKG8z z0HJ%63F$Ld8ursO4?|6@=zWQJC+29u3n+#m1skl}=%Q-w@5@U+#Qcc<4 z726vsGZ6ax`ExfC$;!tT;fJ~j{e?FsQt3cyU>W%PGiq(9+6u{7p;|G1G-;K2u$tRq-> zC}Twc7?Uiqen66jhb3lpK@q@;D09SG|<*oDG?Eo^D6^_ z3K9~M`IVJF81y%hI_Z7Aycr*EngXqd+jq|jWPyJCKL&$DZ^?!iyqZK1L^(MT|T7QMhNE`{929z9)+V z!%jmrHk$S2)c>)vhX0s&|M$W+mQF(E&ll2zLyqg;BA(mtB`MEDOn9cFM>G}P-G7cb z^~!1ceH+C)x9@N6zu3S|soiOdq7RfdwP$|fIIS{Z>CjLAT@EuN`n$@%n|(&iO&VVq ze_vVK($l%jekgSIX^?9oC1gg~K&5)6jZtEtIND zSVbEo*U<)(URMSx_NhRiL@a+=WiK-G-S1JDnCsy_gPS(C>E0Yn!1izVf*nb_(clB< z@qWaIt-nRYz&+O0yVYR={d}V!6DPL(O9tA@0qxSF{!n5%~B?Jc0Z+vwzu5vxgkf$iz)d8al= zKN+r*j)XBGh{y~gv$`q1D~&_aCLeLyDB^m1v*E@@cbW42C~^2h3wIS@>N%9`n>QB? z7n6|8`%NO=%eegms_j!{I(3#N?%%yBf)23ocZ=iyg_MYYk$fF7^5X2wCq%m(*sx;MCPdi_#0_qw0t}a`@^i6PYoKWs9)N@N>A#W z`V-ZyZ8CdcSW-QOIa||~buS#wgyd;AKe?{8U=5&$bnaMSaY?OD-R_YVgONbq30P{- z>T551f7wg;DYFAMeuog-U;n%Egs5}N^BY4^4-#F_WagonMeb?`R@uzCtL@AJrZYhs zJu%8+Cae6Tp&Hkr_^qU|XUE{2N8iQvaI-Mn?~$8SVCvbfow~7S{%mnzmD$X9WlmvCNG|)!U5I$4SV{$|lK@AhW0PT(Vza|5bZ!2n_BTzJ_=HI9Xc0yck>V%dpZCn^Bt3NglK#WOpHHAF+oSX z+pxC{#ADS_fx!zMnd}K}YpbhOK1Y_OGspaGaWYylah4J-_@Mv!xC720u3f8YXUDuV$C!A<) zOifY-Ruelqvgg`_X(tEgSZoLT4W|sN_DqV(#&nq5dbMB60{iC|>bsW6X_Ty0{7b z-Gym z!LhpZ0TIQO!~GWk%3)PoUP&@p1)engm`2}4!BZBBY2JgUYE-oL0*ATRwVQ$sYZ;I{ zPe&;!sV2`I-xD7-KCfNVVh&sXj+qoS&Zy`){AD?vycd zGIg{FC2Yt(f4idRjiDO_xgA&~plJ zEULgCC2j&wyl&Mb1A?MEP@CILP_P#o=l4RZ97R)R@bNK4 zK4zd47Atq6y*Cn4dA8969Hzea5yM~JlI{8JboAF;HQBKJsVX*abSWGgTvq$n2KcGZ zZ>GO-njt(>ai@b8?W@PD=E*5K(+NZ}@Ql7~4u)M+Cm+o|<9}DN-?`;9x-*CU#e+`D zDQ|3?llkC*NHQfFSNbh?jHr7pwRhWzt@=nplzZT+MDa@-JO9BC4{1khElm^|7oscm zPkWS+`+p1TFZ}=Zt(ueHU9ci0uDI|*+ZzNzAJVyCyqSNxG6Fk0wd(%*+y2Ud!iAJm zv%=U&e{M3QRku{O0&HM~2b&KH4WGwOth2QmD#i_T3Msj}3sCCvVEm9J zpa_m;{~y(lP5isXbo~;C)hKdSdx`-u%K;TLoaA_r^{T|;Rvi@wVa5bC)}gEG(DGU? zN2u8_XA%+G67M5*$T4Yx9l3;gdEvZfwwigdAiH=TDxLCuK8Nn=SiVbWIJWAZwH2u+ z@b--W_R^A)830ai+_w#7qbBlx-MGBBhwO=Gjf{$_F8&uy>9$l}^b^3>n=LdTeO?&~ z1y|>xjhK5&)n6HW*tD+3~|L0=^=S~ zlkCdle%AfpfaSvQ-=2pLv5z(z6jiQoc$26S(#yupDT~Vum9ot5us5#G-TuJktwtxf zb${0xKA)^AUSiu`KdMrMe=Oa9zw5rcv!iNh$>Iw$ZjWtXe-o+@VelH5S4x{bwI+q1 zyK=Apxb(44{XwfL?G>KOq3*NN`=$4E8+FL*qFwT0HwlFsRfRIpB#I;D7+xDL04*_{ zf$m*btsP+YRe{GHI#1p^OCTOnQ6Y2$xtR3#H#DRH)6*sE#S_y@yMF{ zNJ@gd6Spa214RzW#K-$}Yn~+TZN3=O2s)a!OF_GVGaCUakV`9p`R{#6yk1S1F@)n$ z_cw;Ak|CZ9=!-d{#s;{Pof=Zmi#no^gprI3t+e@%#f#tN*PD_(KYE4cma*6;7Ym%; zl3cvU4iFtI7ELrmC?wkfLYJzu)b+kB7&ptQTmJ0%^Mic-Hq9A0DBWBhMa0BlW-XcT z{c!3VXs+vMgl()cCx3SAa}7%{uIR`b7ZYh({zB}kBwC|QRlE;RyLs6Hnz#FQ6+)zigKX0}VoG_aG%I%(GD^v>+E7G{4=Zt#TrxC^o5|?cgFd zZ_x?nca}N;bxtP!mdSeJ$i+Wc2E7#cl3e;Ijnpr7CrafXp{|QwYZZUWtVo)Egv&xV z-FGSld7xy~rDGi1bzSh2MsO!lH{UiE_G_uM*qqvv|3$Tr{ZNU{8qY@EbC43ZjgHpt zdygA=Eo^KkIy*Z@W@ygP-M{;I{RUG>mlLs3p9zK6+PpKFrqsS%S3X>K22`=7CY@5F zF#%L@2^BkPyK4KmU%o80HlkdYQ5MWiWPS_?4YZo^KF#e(TMN)z*GXV7I0cq!7wIRP zXgad*IiU7~G}8)Si|I(2^htf`6cWgE?Pr@3EC6eVo}Hatj&5&fCkC9S5)!ZpB)cO$ z|4-&lRr!L^=Lda?=a>&i8}@L-wc)E*hpqx@w(3hEEC+soe_nfxXjCF)VyJj5}cgHl&{0m1hi@ammO; zAC!yxmgu*^v{x0Jud?4d@Ac8&SCh6c?PRC@u&Z5e-CMLIwaPRRwrdUs`B`Sv{-4XS z=!`xkwsy7lw-HzpQW@lRukmuMFI!n<9Ur&%A&|Q_JHLkgklpw&QmX3PK(6{WuOjs0N7^J(L9Y=RO<#iJTXn%1IS->?^1)| zS^KUJ>FDTy-kpeusK1X@7;Gwb$y;l#R%E&|V8VlOW76%xH{Q3Stu~{@>_*KVR&$@F zoQf(wH3+^TfD#G;c|0`d_?V?hhdPNvEOvR-Mg->d=xKs&7H}a%f@veDQ=TfXZmwx^rQlkZvvzn3+|4ep6mwTIjvjgX`su-B&MN-EO!GJVju?6NAwuTiGJoEocl=I6*wQ&*+X{@X2R2E z>oL_sW2YRNNJZ!Pk4Xe)a*rP^EC@-uOl@y*z1Dl;;6ZuHqJ(Tmu5GGtswWV5h#u#; zj?(>16X}e5{Ah^W8W$hxvT<;FeKjurxr0f>!;~QK=A8M&pk85PWsdL%?CS?U3W~eS zsO^b;0%YrnarUNC`9Bx+*xaFN$i|1nYyN~=sJMP9UMzE-T3?^+oq~=f3;G;psHG|J zXTukjy8abXkeO@>*^XD2?2*v*^8lkzLX}pgjO|bXSC6$BwN-q}nE+u#);QxJcH6!N zQ}nW>j*yp^cXPaAZ{#AxIsAUzKTwxE!EYT%SBUqMUm#wdf~yRM)ro)4&~g|V%risR z^)*yt+D2o>6H7#JlHf6xjImbf2M9Fkv59}tErmO86TXn5ivhyVlooL;*d-4PTPjlF zInv5z;h6q>4T-7pLlBCmT};}9(h#m>l@KEbc_-w;m4?=LRyC&SF-=B?aYLoVAaM5R zim(z6Sfo(?SN4oi1$X&9CM_Cx(?iQosjRQzhi7N3plO$t_1{rru{P)R)b_<*>m9|} zB%+^UY-Q@q!n5w;cDv=lh-;1iEYzv?`pkqT}15vd{gd0u&lM4 zl@J~Mg>Pi}rLj}w$q z8r8gqR#nC!s#$P5u=wYWR1~GDE~!`gD_5t)XK`5CU#R7A0M+aFvsT?bLU$6nMs0a2 z+%7IIj#A-Cgy$5C%ask7_l?aju^oRG*f!kDGDlvD zpyJa#LvNYpek!ibX%*|#Y7JhUrJ1k|*(xe4=4ZX?yU=7UdiMf81P)LB!8BoCiXhIU z_`-LM{L=8b(AY|HXD*Ap46C`c(Cf=1L*L`w?o=nq&oXAu-7&LzI*7ND--Fiy;zEfT zmzV#|Skhmd@T)0p>{8j-JfBqLP@#r7$XYZ@*Ph<94ni7m#n0!1ug_4HEUK4PLjhR9 z=tiHg2=d4=Q^dh$cvaK)xIdPpRyfn4cFh+%eNi%>%{M(Ze|C3am(`ftB7*Xv!OB}<(rDFD?hlF1C)B6a>d-MVRY}yV|tdn`!F3zst#Yew!hcn`1RL#Q(|+Ot!Nyy2idq-I{Vy&+YBo)FGIrr*jW=_FGVJhi&kA@6z;aLLL9=TdS5oN z43!qSn6P`OQGo+MDB$v#-Mv5b(Hd@SnWA-`uVW@E{R@=S?`?v%cEK}f^Bh-rH2|

r$iq-xZap7$uxK|25O+2t23+1@2EOEte{_+i`i3F<^R8xDR8T&6_f^NI>HR@t@+OX(w zV$S3*aG>?;ttxga386Ir6Lz)A_4*cW204W5Ky9RRBN9WU-8KE9zMCU&>W|y39`i$jz8}{|zGxXfmcoG6@3~dmdVSc(Wl$FlmAvfspAPcdT`Zsa zgl}U7lZQ$gXs#o32CQ&S&zM>A&!ZIZ7VtuUn>u@2{Xf`fi1TV*lJO#f(rx{w$-}L{ z0;9U*MV+C^q)(kF zS)RBN8|M&FfU@$hop~&mc&r~|d2UPoxh!M#*{(zs0$Ty6mIL{?aofHc%UDqK0g*|q z-S|kYGWk2HR%|J3PWj+UN|TZoZ_k2P+?%hA^O4tMJ8NX^i89#}HhdKN6V2*jH6ab5 z%XaS8V~uLMIUXM8y|Z1Gx`Qh`={mvs0b6CoTh?3H2IX3A+b$&Tpbq8Qv-4b=UN$lk zoJJy{w>MYs1QivK84}6DW)E`ZV_YxnvWKnDFSjZNQo}tPkJQk@Brn;p<_&FmJU(m- ziI+TbSDE$?Q%=74SnT1xt8@5=GL-ELz74L+qYKyeHS42lMbWx}P0#6UZfA**@9u0x z!qBneBav!93C+yiwsI-Be1+HCnoBjO?TWcUU55_KYS_or1}ZZ-HBxevv?VS*9X|(!D0Er=s?35lJfF#&TFM=5eKyWLYc516 zj(zcUJ3i+QX?~lJPfA|>cOW-heDwZm^!;j!FS$bEbz7m3{8D^C;(!!Xx`NYr%TS03 z_y^~Iy$_%@J_R=Fob@tKUO{4?Z__Ad%?4HMgVgx>^GKj%05BCYUo~}T>%_C7fDP^SY46K9?#_;m z;OFLDe3tzbYL2%Z{(b|A5;hZOq`;+^fB%4>&Nr>3L$?mGt9MIXJAKB&RSrCeXHKqC z39{JU9-Wy)H6Cpe0>Jah^GcU%u_dELG09gd{-deBM{lfPVyE}^T|AFXCQFmd1r05H zq$p%#6&>mPVxNuJw+XdKTx#zIIun8d;-0t(Kw}~r8pCZ^#{&!uJ-EL}>&+?kUdvIe z58`-?Gf|UyDD?r14vFuPjj(a|O{9T8e5Dmc;8kM>3@gcjaZe3bC-+P*y>2gP$qDurKb;jUEM#+OXjXyV+GGR5 z=jM-<_s*DZ=`IQcGSG$j*xt!IOeqdnp8pApf5|_C2lWbl?d&j!ET8>0F*UG*l|5pw zUk5|h*-Y~9H;fc++sYx%y~H|n$?j^$lQ2l|M9^A!QOK||#D&KsIzApRKfl9eU~f0T ziZ^B&U#S0$GXJ2kBr4h4W@i#lTJWvW={JwB)+4K}Jo`abW^y|y55sm`z6C=sWrC92 z$>vy*RuK`HG5qk=Mp1j#xQpwwYjORiqP;`&9TKBl*B`IOmk7FJe#2|xg1|tMHr;K{ zsj^AHB8rVOABERxmg!jm2M6GUKEZ#+DZ}`oXz~F4_VOc}z6YJ4-B_N%I8W%{C_KP# zs@@4HaW>O2?bO<_KJ4^0C8Za3HmCf?TA1Ot^tOovbr3o|S10eYk(IMzfyR+i!?a(T zT0_GtR@JUM=)3kNiho(32+a7s|S8*E>~KAmY48#321! zoc|-6bav7OkWEFM_(tUdk!Xv=rpJg*zaT2V`n|RDLH6q|&*-&^>f{!&Qw%V=r6~>% zN?8BPB@=4(cdKGJu%G|CF$dmXpKFm*#|MlYF38juZ+#Q&zg(`OT36>&P{THYueFP% z`>;)Zeh63+2 zmWaiER)gp;GGyOO)Oql8Q|mTfF2$W$?N%F!g84K|EAV&X;->lS|E2im$ zR@opSpjbizkvt#|xV$27*9KubC#?yfH;kO)FR-bNK2=&V@-FdT=?vuRTw&8V^4smn7wSKdqyIX}nSPnozm^JQZdSc(w z5@0j6w(ubx^^8^B?uo=81h=N3@E73z?w<6B$!pjL7J7LvsTM!Rt0 z2DaLnw7Q_m`7)*v;U`<;)wW|CbC4?swEJ&Z_!MnGaNy|Z*s75tU?ZcVg5OFH>+J9_ zM<4n~T_P^E)B5K9)h^fFsTdk)&-NZHA(;0g_*qFoie}~nJ9+tntUPVzS6k zya6}C35}H6UEZaZVJu;&+Gf)lK*g`eSkm`#abyZco&AsS{#BT$BVuXML0>snI=AbY zp|E~NUnK*~{Hv`yZrD7BD-TDcQf8CLW&J^?}x zM>4wtI1;oVG}y$w=Q~7zGN872cfv7lLCJ%aS1>Y?DRa4~(&TOZaP8MsH46mDO-`33 z!=z3bUs%TE`o{Evu>mFJu({<-55EDZ-^HY{%8!^{c~TZ z1;bGMg2Bb9T8*I8P8koIqOSzwM^_bfsXU|@yhuy)BQpPwS2PG z`Hy^3&~$e(MHx3EHHeaUO;~hOU%&b#1%xA&o6|zwDsUVMFDYG$zpKBNdI`x)wTCBR zw$E!*YnOu&So2G33hvRB3f&~`Gqi9}%L)7MvjO@+#FvCcoX3wmrwWdcO)$_R{`UPl z{#&+f_l=QIu}~||QhU*?4qCx~oAS+PbBRk#0m$YTq?fZ3v*dga6(dLQk73y49yu}b{t|kdxcow4 z|M>K`(0>mz+f4l*$V5a(G4YAx{dywu_Lz*Q`Cr9{Lu#h|gA*n`f$z9(WKW444Nba0 z23916J-)j{S zvs{py6J3zl%HGYvC~|t|wR9w#G6)U;r)6$knRw+p02A24Upmgb(zoS!gxYX~b2rIr zf>X}6hW1r$zE^{PdE1X-fpS`HvLro@4gjJ4Ww}n=*FYjOUOGMdf|8d zzUswDPf!1R?nwE z68(GcZ5&pNyoK>wnEs6{iGB>A#aNipV9kUys ztIAfJ5xuYHqLg5+p}?yO*c|}>nQKwMmv@d+oldPcVK1fnRsdJ1g0afhC|?DVIc`j; z2%=fvd2bXet5{U6R6zSD?N-ftS*Iz9a{+1ef23TxFCW&XdDL1Cs_>+VXZ}~6g@#5u zt@v76>&YuELrn4ErHVr?{`L1dZlDwS(bBTo>W&V?wwo*X>t@dry@vS!{{&yRp~i3C z$v#oHOf2mLL25UW`98TEg|$lhb@n|#Qt=38DJ9iPJr`t1Rjgam`}4>K*jirjOU`Y= zi^qz8Pu0?hdw&Iy8kNOKQjc+;)wKgMP=6p0XsmgIFC1Lx$AOG$HTtB?^jH?5sC8RG zw8F`J)<^}f!`9!>sudR6e@aS9?c?J~^(de43KrEI>1nlxV>ZjKf(TDvA5TlH7cBlt z-dX}s*g40UIREz{G?S%DIW4y~U)zhHNY-l4ftOEcMdilJRee6Z(On(T`_pk&x45;J zG+bmPkwJApiw!k=UDjAfX%{TdoqT#^2wc}xQv~iU#1;Y3AN^i_Ab#!KW0^V26(%nF z-CO}$wOrBKaJAc9wtIC@kZJud2NSeGp3rf>-uOxf4v1tRz&qGJ;(ZI7Oc#LdF^g-D zhY^BIP`G82{IueN7M1lDOWn}Y@$-P1>W779g1Gqf08OE;6weKa(>C_<+Uj8&r+H(p z!aamfGhG`h8k0&y_;+6?ZNzTK}Od&^1X*k zUW(h!Ue`2lx|G_EC^SdME;8nE2SNdi*Au+}yb1Y-ajwk7Z-0c_-*deHCtD$wCfjzb zSf_#;091IS9QRfdNB;~4b^G9B{%5mZ(UdR30Be&vfIWxC?Oz8IfC60ev$BE|um~)7 zomySa3O7DJOV9og>}h@E_Wo?P?|5e{JzExQxJZ-L7j}-RO;wNmA18C%WW|{kpq3r4 z4=-W0e#v2GW`6E_Y@M&3`6LMRD+mZMFMNFPeRdom7uT}-Gn481Cscfan;!)>?XE=s zXqCQBn)5nXEm%UIs9!Mwwq7=)t5aI;3S%_HppOV%Sb%Tq;1}&?kkn_58{CN-wRk_j z*OrUU*2V~wXchG*zZm3nUKtx`QAlB1aVnHAFb1;TRiC{Fv!2_TuSqa~3U0W{F1mM6f{K^sN z5rBcw{i$2gdaEDi6vD>DudEy~tzvD>253S*e?9{k_++yeZ)Ig=XJ;o`7lBQv%%^un zou+(QJp+uu6T9hzYUW+Fh03&Ar-49wtoN;myts)sssiY69&~YZ_?dV8GFxK#@EM~q zH&AL0vO~&a+|rFfAl{a4ltNOxUPzKGes-;^k_k@(BRLOR!|5>+M~f|#!z52B)TM4} z#>$uS@g~7PE7Y&$0C&$;QvV8Pf$_d4pPIsNfd_z5R{lDop2)R(Bn{`d4i9ERQ`8!6RX&z-65S-Y9DJ`^gGQ3x-V_>6@sXq?WvcNMnw<6O(Yb<}PD;N9UrUa|Gr64utij1I8AG}uViPcEr% z-h~kIfX;VF!_M;R>PV5S-2;DoL*c+Up0X0+?WG=GDQmu+z!x<< z0u5h}3PLfJBD!!}YGi2`*BE$rD|8x)!(hnrNdd>j09dlNh+GP~Pl?}N-RRYAOCaYp z+`!<{>it~5hJpaq?w4w+Ldz6>p7?rQl=_$Uk7@1X`OSB2_4?!^459_NA2B#mgI)}| zym-gdSYWmP;oZ4uufC|{C59kJSe4i1SH=!CrMeWM+X>`B$oCHf7CWfcOwi0q9DGD1 z)1U&fzliB}kRVdr9-BYBqC8&-hT~HSLU*uv_#9sg88;L#(9z))n6a|I$W+L8%2TYk z(i1r-`Jlc>C+f}De7c)}7e_dr4DhGdjrBI8EW2B%a4-4eXPwmG5|~ICF(&zMo>S@K zy`)=ywhh{BzJbk=u>qGye||bC3B0g7s&fF(atfwirn9uN!fdyKqk(n5pn738nyo8i zX6X}6H^QyAup}#b>)#DejSd7!C>7r5af&g}(pcD$sG2HzC zvQ5gN#b+F@6&S+ialfKhjP>=gGI@=mGTEjF$JJ>pqs+*5w=-g4k`VvaGGFQHHH&PKW@FA2oMh$uJ-QM+KC{jJ^$6&& z|KQUBU%^S^TY*v|D6ix-2s!`nKa~Itx6`yYi@)p14zwyn-OEVLgto2mj?=`Gx+1j0 zhY(sz^RcuRQ-xe14UqqP8Njro%I-`OfDecO-qtsL#b)kh)N+Vkvl$I;nt;SaV)jY* zYY4G41YYRxe=&bD&b*DI5euL=nHe&GsK^3#dGvzSIFAlj+JL$n0bx*Lvz@{bs)&Sc zJ&*u}yuFb(DJIOpXG`OD9s?Si4$yonUs?f&#R=e#yodP;1`ejH#$3iw@PEVs6|&G} zRS4mqpKsYbsqn+dJof;RCWKHX;;>C`KF(%C28RK>iu(%>0Z-=t`igId z@!=gCiAtLAuw!Te1m>$%tfg2iB{Kuu<8T;WLvK4A4$f(xIyE_{&9_Nt6$?YAUC{fI1CctA~oJ| z8`PL02Ga#>MnZs03FB*W!sA!(-VuRu$bY{;*E*n*i=VLR8sd^TIvte3?!?h}Kp$}Y zRLpbtp($twue*z?r3stC17}$2fmM^|4mFi$ERD!#wSs0dByVR73#eH`*ghfX{GyeU zcwF}9r8#uVRjRvUCcXCmOHNJ($x1YCJiL7z5iX~km^Eg5aCpdZ>IO*QfL}HZ?d$H& za-41IPZ5lg4#ol{YiL7)B6#BwL=jO@OTbz3`Q24#B=OIJ0%8h^Hz1IDEZU9a2Vi$W z=}mHeng5^at~8v=bqz0db{QHL6=lkbg)Ny*mYFsoBtzOt#?Wq?A}hi|Hp);rwoI8S zDaE0!#KAJOS7n=r%9z?_Z9{8G66xIE+Sj?xxz7G^uJhykIQ{JUeCvDP_j&Kw3r07Nq0?1APKeF zmvDnl_Z_PVv~5z#I}K;6yHZa=W@29OBf817p|YcusFw2aDIVy7f-ZyRdo83@isEO= zT{)popn$YO-^+(B&QhhM>fhED^13(1B_y1gazyz~u3pvQKi3MQ)Jj@jK2B0EEIB*- zQc}|9#f9qX=cO)j15tpk82=Q9zupc@*Fi#{{Ji+smh=7P-hrG^vw79;+OjEVHI(Yz zQ^gock+ZUWaMF@cvq6MdJPQrdb_FZy;oFCH=ZH{PzUbmiHmo!&uuV?Ri7qWI{n;IQ zSQA%QV&au@<{!rj5QIQb@I&1ED>^<9h;q}F`Szvh2kodQQf8M61XL4{L-vC;qO7iG zN)_@P)aq9<+7N+uV!lwQhWHMuZPVeAnO3>Hh;{YndDg;AZPsvYa6{#QqmRmVUVi>v zdg`en&gY`2i6Y$v$2Aa$7=Qk>U~|{blU`uRl}S-pmb-8gZ}4R$1w69a$?2nzc$>%a zZ!2jIbV00BSSYWn>%l3J&m*=09+r}Nb3t)KVfR$awy$#z$=xu$YQb^Z6GN`hYJQQW zF50@WMu^gM1=%=xm^Oh6iceJpQ<}sO4F2am`-e?Ec=Need2?0@e?T>NvsV-*Y}*a4 zn~|?<6nFdwMO}IPZlQ6aaKKnoDzVWAg}7h2=N`gnus1Q4o&<>g0UZADL;sE*|APkx zZ{gNcQ>aGs7#u#!EShoA3*lwQ`SDh1Dz#v1>7lseiG&eW@=;}EtkK;JJGN!6uH6&c z9hme}??l+UhV@f8!~WX&2Dw7GT`ZgjSPx_(=@b^ErEprDOI z`W}|01!2j99$j5syaEDiU14M^tIKl_{a%TlhuaX6kZ6U3;rPvoLT9G7zW$K7J|m_f zdOeg(W;9=gKCRfwOfG6<9YAMYH#ax@;We6Xe@9(pBoSm|+aNQz6EZ)pc&v;y>%KTM zU<%_zD0D7V`wM&Z^CBbzIhM_7dzKboNA{I_ix7mFg2FvT=QOfLHWBo&ELk84qSmhG z^teQJ-nJBz4Dle7pp3c=n;<5$0Oh4Ly?g_nM_$q)3tw|4HB>( zu*Fs()x*q=!yr-2_Prp*O+iI^mpdn&0{Ex6(Q_`lK}+MSOfb$^_xjjf*B6 zE8lIV`Sk9CYl@1B>RDLe50K^p!JrJDgp(!wF4ZFKe!z%{L%G)zkXoHy<@DcPwlaLa z`GyCtg7g37tvI0lIx-13y5kFM&Cptnp>xqz`b)PCqF}ct>j7mC0c$MF6KFbvwZDi` z8voUm5aK9wtU0}P@wWw{^EU}srQmh(Ke<2SpcF1SEzJb!B$h))3q?Xf8`ecHsXoHc zjRCq%tFe3mTZr@m3O~%;wJ$?eXT1Y^Z4^@9Pxp1tx@*%X>#;FR{ry#NZtD5VkJJo> zMVwd4K)N3n$J>@?a9Ukv-GQIWD*t+*yNqmjRW;|(`g$M_``x?x*RSgupP^1vrvS}o#0syR3>ha)XgBk z8xcW)MLM1WEwnbe;f=qlA*D%&h}>*05EF-2K=D!RSf1e7oW{l$(hP6GCvN}q$%Dxg zZH!=4r=|`! z_33_^%$MKF-~aG?BUm861fZpLv%!k%>LSj8&wcs47(h!DmQq$uf`(|`y62Wz3ei0c z;1i_56aFS@ePdf&&_V&9O$irFg-&%`=RtcrpZGQ`>!w_Yzys?c$qvhID^Y{_U_LUw zbI@C!esF20K`#6}PtVD-0R4?j=gsGnlC0uOj>H{LCGcK83ct@mJKa8JyQ|99V+A}T zvlGOW%gUxrI-myd+*qo8ivXX(R({ElQNb%a4X)VU^%!QwQ?={J6>8jxYeH`?upUyH znsG`_vmPrS*)lRR9oN4J$9A=!{74*%Epa>_q1UBT@T(`7;o{jm{c!E*^#;Q))ghTA z;a(Qv+NF*gMwu#ZYq0C~n*n1h_Wu5MC8sJD!ggFKN)S|~%nzcQ^*@q6FTb`(6pj^% zni;52MvMjHzfYgCl? zn_MB^=KvpOeyXp`6Wql`jN!g(!y0_GDRyCQ?$dH7OXgnVg;5fOo^ilD!eNCkzIyh< zR{~9+II;2?9^QPILTRTey2%Y|p>5lY5s@KAU5m>#F{qxzDX``F&dgBb532-xsC&O8 zO0b2M92+5fK3XFp#quSNJ`gyeU^*Y+6@8}vMZpNVXrhPu2~6RWh_>Ql#kVhtE+Sk! za?j2UF{F~ZsesLpR?#~`h--M2IAEJSgYw$<-Bweb`RhsLUN7k1k6(2z{SG9?_#Oo? z6DU%?Zk8e|6cpp1%ndb9Kr#Vy1b~iov5V|WANBt__!9n#XyWlI`1ROFcFOcXMQMjB zahMJ(Btc)k4cMBlh=xm##^)G+)Q~z2sg_swqwVR@w)cR&jKWuD(iTV zo%x7{57|4@jy;^*T*EwaFpJj87$|Y7o*ZI|ovu+$P_F%mD|_mZ_ZK=<)1VmG^i}_w zqLEl~2{+mj&W()Fq);g1eKwIw&QEco?f>@u_ZO3vpg%#f4R@cx3|l-i+9+84tl-uy zm9uZ{NI+7nh}wRy@o!B`)?r+3D<74K-G#oH-smTr!@q50I~9^SXBvE93G{s7rfs*=~ zEf@iMhZce~gQQ{KzVimmP|;G)nf|lmdv?W;XOjsq-Cl%wbo{lez~fM^?&Z9^og}D< zPGI&o?VJFm3(nsRgaIlU=%2(1K|B(ept*rEPXP$|hL~ZT#{%t#OCxkelw~>#yzNac zZEpZTIQF|(@Vez;Jz2hU(Lc>?5fU=ozyD9>1zq!&mKjmygRC(gSzG6Qo1b?@r;=}~96M(X ziYRNLS-EC;XgfkER-w)5GW7kxsfuF+1165X1uo}ClTFR-!tX-1w6x@f=*i`W=x9{+ zT+tGL!eU+jwg@@iaQ*69wPNaiRc`+Na$Gsvl)>0Y^IO>r0UywJ^5ux0p56}KbN=zA z=STiQyItUvMzNBkQK#8Iee!2z7j)EIc zJWrn+Lgo)rmD*>4luz9M`Qbpl9Ie0$@Bt3!ZL?ce_NjOqmM7&)ATot@3i9&T;fa-I z5|rFb1Pl8e+O;}aHTF|EN&`06bWHWjA5jXD+SWA>?0Evcv|37Y;Yy>XgyOs>qUL{UH zw8(&5zm6k(0n1#&@jSKsVWtLsgkup44}an&W}cG}crZKDrDFCG0rJ&MdzbK3ql=q( zp6XS@Z(rfUx-^2-@w<0&*SuMp$g69xmuAga23d$0#;J|Zj2Ky4lYdE9e*OEPUUkJ{ z2E1OENbtuFo48ycSEzG=_W~vsvAJELHBWSdRD)@p*naNs-B`C#)E~Q!v`boghdx6S zH^rbv`t_ULTZTXE0-Z={vaXBxeBf_qVpnQ((IRF)u#JzOzp68x%JMZOh*SWclBTyq z+JDEW?9dG1$Os54R(7T%PceTN}-P{U5!*h*=`UCWcp0oj^y6 zW{WvzW`<_K@a0-@FvQ$!-4=EvhhvS??>%`bJ}9UA=OW_o!iXFeUpUJ}H86^D#F+lE z%K!flJa$#ltUY|AH$Vb+)(}atjO~VXM#^Eqnj2xZ#6Tg1gj@Sh3>WdhvO%yr{e-Ss Rk|zoO%#081FEMoe;qP&Ff2IHc literal 0 HcmV?d00001 diff --git a/docs/source/content/api-ref.rst b/docs/source/content/api-ref.rst index e059f59..41bd7f9 100644 --- a/docs/source/content/api-ref.rst +++ b/docs/source/content/api-ref.rst @@ -238,14 +238,11 @@ sample ========== sample模块主要存放示例数据 -.. py:function:: load_dem(area_name, **kwargs) +.. py:function:: load_dem() :module: cnmaps.sample 加载中国地区的 DEM 海拔样例数据 - :param str area_name: - 区域名称, 目前仅支持 ``'京津冀'``, 若为None则取全国. 默认为 None. - :return: (lons, lats, data) diff --git a/docs/source/content/usage.rst b/docs/source/content/usage.rst index f58362a..068b57c 100644 --- a/docs/source/content/usage.rst +++ b/docs/source/content/usage.rst @@ -251,6 +251,9 @@ cnmaps可以很方便地对地图进行合并,例如我们可以将北京、 .. code:: python + import numpy as np + import matplotlib.pyplot as plt + import cartopy.crs as ccrs from cnmaps import get_adm_maps, clip_contours_by_map, draw_map from cnmaps.sample import load_dem @@ -296,10 +299,43 @@ cnmaps可以很方便地对地图进行合并,例如我们可以将北京、 .. image:: ../_static/clip-china-pcolormesh.png +剪切箭矢簇(quiver)图 + +.. code:: python + + import numpy as np + from cnmaps import get_adm_maps, clip_quiver_by_map, clip_contours_by_map, draw_map + from cnmaps.sample import load_wind + + lons, lats, u, v = load_wind() + + fig = plt.figure(figsize=(10, 10)) + ax = fig.add_subplot(111, projection=ccrs.PlateCarree()) + map_polygon = get_adm_maps(country='中华人民共和国', record='first', only_polygon=True) + + spd = (u ** 2 + v ** 2) ** 0.5 + + qv = ax.quiver(lons, lats, u, v,transform=ccrs.PlateCarree(), zorder=2) + cs = ax.contourf(lons, lats, spd, cmap=plt.cm.RdYlBu_r, + levels=np.linspace(spd.min(), spd.max(), 50), + transform=ccrs.PlateCarree(), zorder=1) + + clip_contours_by_map(cs, map_polygon) + clip_quiver_by_map(qv, map_polygon) + + draw_map(map_polygon, color='k', linewidth=1) + + plt.show() + +.. image:: ../_static/clip-china-quiver.png + 剪切等值线clabel .. code:: python + import numpy as np + import matplotlib.pyplot as plt + import cartopy.crs as ccrs from cnmaps import get_adm_maps, clip_clabels_by_map, clip_contours_by_map, draw_map from cnmaps.sample import load_dem diff --git a/requirements.txt b/requirements.txt index 66c95b2..51769bc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ matplotlib>=3.4.2 numpy>=1.21.5 -Shapely>=1.8.0 +Shapely>=1.8.0,<2.0 netCDF4>=1.5.8 geopandas>=0.10.2 geojson>=2.5.0 diff --git a/tests/test_drawing.py b/tests/test_drawing.py index a57f204..9b52f8b 100644 --- a/tests/test_drawing.py +++ b/tests/test_drawing.py @@ -13,11 +13,12 @@ clip_clabels_by_map, clip_contours_by_map, draw_map, + draw_maps, clip_pcolormesh_by_map, clip_quiver_by_map, clip_scatter_by_map, ) -from cnmaps.sample import load_dem +from cnmaps.sample import load_dem, load_temp, load_wind provinces = get_adm_names(level="省") cities = get_adm_names(level="市") @@ -25,7 +26,8 @@ sample_districts = [random.choice(districts) for _ in range(100)] map_args = ( - [ + [{"only_polygon": True, "record": "first", "name": "中华人民共和国"}] + + [ {"province": p, "only_polygon": True, "record": "first", "name": p} for p in provinces ] @@ -37,6 +39,54 @@ ) +def test_draw_maps(): + """测试多地图绘制功能""" + map_args = ( + [{"level": "国", "name": "中华人民共和国"}] + + [{"level": "省", "name": "中华人民共和国-分省"}] + + [{"province": p, "level": "市", "name": p} for p in provinces] + + [{"city": c, "level": "区县", "name": c} for c in cities] + ) + for map_arg in map_args: + name = map_arg["name"] + + fig = plt.figure(figsize=(10, 10)) + ax = fig.add_subplot(111, projection=ccrs.PlateCarree()) + map_polygon = get_adm_maps(**map_arg) + + draw_maps(map_polygon, linewidth=1) + savefp = os.path.join("./tmp", f"{name}.png") + os.makedirs(os.path.dirname(savefp), exist_ok=True) + plt.savefig(savefp, bbox_inches="tight") + plt.close() + + shutil.rmtree("./tmp") + + map_args = ( + [{"level": "国", "engine": "geopandas", "name": "中华人民共和国"}] + + [{"level": "省", "engine": "geopandas", "name": "中华人民共和国-分省"}] + + [ + {"province": p, "level": "市", "engine": "geopandas", "name": p} + for p in provinces + ] + + [{"city": c, "level": "区县", "engine": "geopandas", "name": c} for c in cities] + ) + for map_arg in map_args: + name = map_arg["name"] + + fig = plt.figure(figsize=(10, 10)) + ax = fig.add_subplot(111, projection=ccrs.PlateCarree()) + map_polygon = get_adm_maps(**map_arg) + + draw_maps(map_polygon, linewidth=1) + savefp = os.path.join("./tmp", f"{name}.png") + os.makedirs(os.path.dirname(savefp), exist_ok=True) + plt.savefig(savefp, bbox_inches="tight") + plt.close() + + shutil.rmtree("./tmp") + + def test_clip_scatter(): """测试剪切散点图.""" @@ -105,7 +155,7 @@ def test_clip_pcolormesh(): def test_clip_contour(): """测试剪切等值线.""" - lons, lats, data = load_dem() + lons, lats, data = load_temp() for map_arg in map_args: name = map_arg["name"] @@ -119,7 +169,7 @@ def test_clip_contour(): lats, data, colors="b", - levels=np.linspace(-2800, data.max(), 5), + levels=np.linspace(-30, 40, 10), transform=ccrs.PlateCarree(), ) @@ -136,7 +186,7 @@ def test_clip_contour(): def test_clip_contourf(): """测试切割填色等值线.""" - lons, lats, data = load_dem() + lons, lats, data = load_temp() for map_arg in map_args: name = map_arg["name"] @@ -150,7 +200,7 @@ def test_clip_contourf(): lats, data, cmap=plt.cm.terrain, - levels=np.linspace(-2800, data.max(), 5), + levels=np.linspace(-30, 40, 10), transform=ccrs.PlateCarree(), ) @@ -167,10 +217,7 @@ def test_clip_contourf(): def test_clip_quiver(): """测试切割箭矢簇.""" - lons, lats, data = load_dem() - - u = np.full(data.shape, 1) - v = np.full(data.shape, 1) + lons, lats, u, v = load_wind() for map_arg in map_args: name = map_arg["name"] @@ -198,7 +245,7 @@ def test_clip_clabel(): """测试切割等值线标签.""" lons, lats, data = load_dem() - map_polygon = get_adm_maps(province="河南省", record="first", only_polygon=True) + map_polygon = get_adm_maps(record="first", only_polygon=True) fig = plt.figure(figsize=(10, 10)) ax = fig.add_subplot(111, projection=ccrs.PlateCarree()) contours = ax.contour( diff --git a/tests/test_geo.py b/tests/test_geo.py new file mode 100644 index 0000000..2652963 --- /dev/null +++ b/tests/test_geo.py @@ -0,0 +1,30 @@ +from cnmaps.geo import ( + gcj02_to_bd09, + bd09_to_gcj02, + wgs84_to_gcj02, + gcj02_to_wgs84, + bd09_to_wgs84, + wgs84_to_bd09, +) + + +def test_coord_convert(): + """测试坐标点转换""" + coord = (116.404844, 39.913385) + + cases = [ + [gcj02_to_bd09, (116.4112158902278, 39.919718858979216)], + [bd09_to_gcj02, (116.39847040646384, 39.90703956272512)], + [wgs84_to_gcj02, (116.41108813801904, 39.914789143675165)], + [gcj02_to_wgs84, (116.39859986198095, 39.91198085632483)], + [bd09_to_wgs84, (116.39222688049742, 39.90563594282613)], + [wgs84_to_bd09, (116.41747478452356, 39.92107661831225)], + ] + + for func, result in cases: + _result = func(*coord) + assert _result == result + + +if __name__ == "__main__": + pass diff --git a/tests/test_map.py b/tests/test_map.py index 4c0cbd4..d295948 100644 --- a/tests/test_map.py +++ b/tests/test_map.py @@ -6,6 +6,7 @@ import fiona import numpy as np +from geopandas import GeoDataFrame from cnmaps import ( get_adm_maps, @@ -84,6 +85,12 @@ def test_make_maskout_array(): assert (china_maskout_array == mask_array).all() + with pytest.raises(ValueError): + china.make_mask_array(lon, lat) + + with pytest.raises(ValueError): + china.make_mask_array(lons, lats[:-1]) + def test_mappolygon_to_file(): """测试将MapPolygon保存为文件.""" @@ -125,6 +132,16 @@ def test_map_load(): assert len(get_adm_maps(level="市")) == 370 assert len(get_adm_maps(level="区县")) == 2875 + assert isinstance(get_adm_maps(level="国", engine="geopandas"), GeoDataFrame) + assert isinstance(get_adm_maps(level="省", engine="geopandas"), GeoDataFrame) + assert isinstance(get_adm_maps(level="市", engine="geopandas"), GeoDataFrame) + assert isinstance(get_adm_maps(level="区县", engine="geopandas"), GeoDataFrame) + + assert len(get_adm_maps(level="国", engine="geopandas")) == 2 + assert len(get_adm_maps(level="省", engine="geopandas")) == 34 + assert len(get_adm_maps(level="市", engine="geopandas")) == 370 + assert len(get_adm_maps(level="区县", engine="geopandas")) == 2875 + beijing = get_adm_maps(province="北京市")[0] assert ( beijing["省/直辖市"] == "北京市" @@ -146,6 +163,28 @@ def test_map_load(): assert len(get_adm_maps(province="河南省", level="市")) == 18 assert len(get_adm_maps(city="郑州市", level="区县")) == 12 + assert len(get_adm_maps(city="北京市", district="朝阳区", engine="geopandas")) == 1 + assert len(get_adm_maps(city="北京市", level="区县", engine="geopandas")) == 16 + assert len(get_adm_maps(province="河南省", level="市", engine="geopandas")) == 18 + assert len(get_adm_maps(city="郑州市", level="区县", engine="geopandas")) == 12 + + with pytest.raises(MapNotFoundError): + get_adm_maps(country="法国") + + with pytest.raises(MapNotFoundError): + get_adm_maps(province="麻省") + + with pytest.raises(MapNotFoundError): + get_adm_maps(city="纽约市") + + with pytest.raises(MapNotFoundError): + get_adm_maps(district="曼哈顿") + + with pytest.raises(ValueError): + get_adm_maps(level="郡") + + get_adm_maps(only_polygon=True, engine="geopandas") + def test_map_operator(): """测试地图之间的操作符是否正常."""