From c13f27a95df33fe6f85fc0989737567f060441a6 Mon Sep 17 00:00:00 2001 From: Karim Bahgat Date: Thu, 30 Jul 2015 16:51:57 +0200 Subject: [PATCH] Make proj4 compatible with the find() name-to-obj functions --- pycrs/parser.py | 90 +++++++++++++++++++++-------------------------- pycrs/parser.pyc | Bin 11422 -> 11237 bytes 2 files changed, 41 insertions(+), 49 deletions(-) diff --git a/pycrs/parser.py b/pycrs/parser.py index b5027df..2b0c943 100644 --- a/pycrs/parser.py +++ b/pycrs/parser.py @@ -321,7 +321,7 @@ def _from_wkt(string, wkttype, strict=False): ## # then load with appropriate function ## pass -def from_proj4(string): +def from_proj4(string, strict=False): # parse arguments into components # use args to create crs @@ -360,17 +360,9 @@ def from_proj4(string): if "+datum" in partdict: # get predefined datum def - for itemname in dir(datums): - item = getattr(datums, itemname) - try: - item = item() - if hasattr(item, "proj4") and partdict["+datum"] == item.proj4: - datumdef = item - break - except: - pass - - else: + datumname = partdict["+datum"] + datumdef = datums.find(datumname, "proj4", strict)() + if not datumdef: datumdef = datums.Unknown() else: @@ -382,15 +374,10 @@ def from_proj4(string): if "+ellps" in partdict: # get predefined ellips def - for itemname in dir(ellipsoids): - item = getattr(ellipsoids, itemname) - try: - item = item() - if hasattr(item, "proj4") and partdict["+ellps"] == item.proj4: - ellipsdef = item - break - except: - pass + ellipsname = partdict["+ellps"] + ellipsdef = ellipsoids.find(ellipsname, "proj4", strict)() + if not ellipsdef: + raise Exception("The ellipsoid name did not match any definitions") else: raise Exception("Could not find required +ellps element") @@ -457,18 +444,8 @@ def from_proj4(string): if "+proj" in partdict: # get predefined proj def - for itemname in dir(projections): - item = getattr(projections, itemname) - try: - item = item() - if hasattr(item, "proj4") and partdict["+proj"] == item.proj4: - projdef = item - break - except: - pass - - else: - projdef = None + projname = partdict["+proj"] + projdef = projections.find(projname, "proj4", strict)() else: raise Exception("Could not find required +proj element") @@ -478,6 +455,13 @@ def from_proj4(string): # create proj param obj proj = parameters.Projection(projdef) +## # collect param objects +## for key,val in partdict.items(): +## objclass = parameters.find(key, "proj4", strict) +## if objclass: +## obj = objclass(val) +## params.append(obj) + # CENTRAL MERIDIAN if "+lon_0" in partdict: @@ -549,22 +533,6 @@ def from_proj4(string): obj = parameters.LatitudeSecondStndParallel(val) params.append(obj) - # UNIT - - ## set default - metmulti = parameters.MeterMultiplier(1.0) - unittype = parameters.UnitType(units.Meter()) - - ## override with user input - if "+to_meter" in partdict: - metmulti = parameters.MeterMultiplier(partdict["+to_meter"]) - if "+units" in partdict: - if partdict["+units"] == "m": - unittype = parameters.UnitType(units.Meter()) - - ## create unitobj - unit = parameters.Unit(unittype, metmulti) - # SATELLITE HEIGHT if "+h" in partdict: val = partdict["+h"] @@ -577,6 +545,24 @@ def from_proj4(string): obj = parameters.TiltAngle(val) params.append(obj) + # UNIT + + ## set default + metmulti = parameters.MeterMultiplier(1.0) + unittype = parameters.UnitType(units.Meter()) + + ## override with user input + if "+to_meter" in partdict: + metmulti = parameters.MeterMultiplier(partdict["+to_meter"]) + if "+units" in partdict: + unitname = partdict["+units"] + unit = units.find(unitname, "proj4", strict)() + if unit: + unittype = parameters.UnitType(unit) + + ## create unitobj + unit = parameters.Unit(unittype, metmulti) + # PROJCS projcs = parameters.ProjCS("Unknown", geogcs, proj, params, unit) @@ -592,6 +578,7 @@ def from_proj4(string): return crs + ##def from_ogc_urn(string): ## # hmmm, seems like ogc urn could be anything incl online link, epsg, etc... ## # if necessary, must go online (or lookup local table) to get details @@ -616,6 +603,7 @@ def from_proj4(string): ## ## pass + def from_unknown_text(text): """Detect type and load with appropriate function""" @@ -639,5 +627,9 @@ def from_unknown_text(text): else: raise Exception("Could not detect which type of crs") + ##def from_geotiff_parameters(**params): ## pass + + + diff --git a/pycrs/parser.pyc b/pycrs/parser.pyc index 4eb4c9b55aa48da2c55a0df6d472cb3a4d6dc300..090d0c5dcc9a3a281e5550e4cc171f063cb176cd 100644 GIT binary patch delta 2106 zcmaJ?O>7%g5T3W|pTu6r@&9jPC$?h;7bz;Df{030%K=d#B#VHMQXurX#BQ=7_DZO* ztCgA_;E1+DoRC1`fO0^P3qo+I#H}|Z5F8K}0_v3mCnz(se%l1qSn}?B^Ue3oym@cl ze)RHhFIDtE6R~?we7$iMCO-||7w|v+>ix$VUS_CuEFR-uuus7&=>(3g##U&D40$5nPH!Al+Ud4Y4}c{@{B$_ z&%%@cN%AfyIRo|#48xQsCM9r!S)P|M7-9x-xCMxNYt@?Tuj5@_hXEyL7OYtq#=xGX zOl@4dPStVH5`*z=L1=tp*}pAJgZ-5S3qPsM&#ah0#W+|7E5=VN8ekjXj*o?v069l# z-W0HZ%#vtHPAqa>NftCJ_Pk&06fZLY)*K9zU?+Gw2PW1FEyyuIrinRBfy@vpvuc{7 z>4DIkB)AgO@N3Z5h>09rDh9`WoCot91)Mm%cgn%WlyQsDC(R*G6G_Sa}#0sM_R~;W$OGk)7rQvur7WEP;(_rohg^K?s~2 z$g&D}S*K8C+=x6_W!{MVgN<-$Zwo-%h&8WJ9NY!F0Hb>mT0@1#6ubzssw6*V$tp^g zH~|Do?1Vuz7%qTarm4WqkT~(n`va2}0@5OrT$FwY3qhY14^j4u0ju^up%7!zxDk?d zC18c5vX7o(u^Nk+ST%H-oc|3*>OSHhAq1x`YDuYo#=NBL^wgBm}0BsJz%!t9(39b`@Hvt6XX;`G`_}oew=<6lg5b z!B10j%C7P_%omWThO9NhJgOhmpzUgwcWyzEI^3>T(OC zH+DCEfRKaVkOhX$fW5#Hi(n>|g>NtiyJYd`^W_!s*cyJ?UfAx}`#U>>H^+MeSvR+K z`*lf!J*&REWnJB_Z<#mhvVU!04y?hRdGvjwDNOydd2o-qqj-pEA)8H zd#nAdc;5TAT?xI22JgrAruGMTk9V4xm?(;fNb5$}&?jT>W@j}P6BXUiB6>3Jeb?D& y>V}Akq?lLla8l%OoEKy#g`A!~T3@{{#M|C_cPL)B4ID?dm z8AicKtkI|vQbiYZ(=9|@fY^dqbit;TQR@qjonw!#6*^G%})S8|4+}bw$=6aC8gs zRFKW*;szW8t`W@ThkOH71zVw^aKpgXpbR_{wh7n7Mhx}KiUUq9@r%gvbpu`mUKDNw zb`%>1>R-Y!QROrSHwrtBh6yi*+NAbLXrCWiKFJOrpH6_I*|{;{(g5a{&%tYwJfz3W zwxJ_EBKbqR(0-(8$Kl3NB`;H^iWBm_WT#M#!R}&l^g78g1s(YHd?ru8g-ov5>6Yl9 z)XpxPB%G8i%r7s(OTg)pxtlh z!4DbjYexHIw67L~L@#V|QuvfbXNs^DKG$(FVJq~?vPah}s(oa5^Bz0AuXN;pa>T*y)?G%QK272%P(lsD z&S_dyGuRUGni(!hNe1CtqN2A&dkFTBMr3u!VK^45BeFT-7Us#rrQWP2*stA2VGqM) znR?;&qrtO5$yO_2BC_+b-nuaf($Py}+&cfin(0qdh+3U{M-%rh*KDTyrZm%ibCK7A z&2G%;E}~@e)*I;NP`?uw)u+L+C}CwNgS*P}SHBUF6nR+Qkd`wJH!K20DOAtE9Tt#c z@7kj+Re=VLwn2pxKolA_(9aq))&@<$e}1Y{P1N@95u3!r2fT%c3by0&R+n||Fkbi7{sW?P^s8LgG)NCi}C`jtdgEOr= ztMlNL4-bw_ePQ5-vCvZYXHadBBtNT9{{UP*Via5pjVQbk&FdUo zeF(igYMGWrKm2HM^SD;pOBE*6-g^@T72KIDSdP58H@D@zUS8Xd%FS8-z$u*%zMH&Q za5l)mpKY9Oc%11 zD;!le`BRd=2$lZ8pMG3FyY_3+yvalTdI(;>mDh>s26qk&Y3hosrXZlq} znJTFYDy9+~CCrSOj;77y_O9S@amG4sO_)hDZN$t>FjumI@zSO7Xh!ACv>H@t)vNMm sAIB-C=xyEic1ur{`Xtz$t*VXSVD@(Mt}y3?KpFGFx8<{u