From d1223a066c90e5ee31f2acafc382aad1fb0eef03 Mon Sep 17 00:00:00 2001 From: rouault Date: Mon, 14 Jul 2014 13:53:54 +0000 Subject: [PATCH] MITAB: swap StdParallel1 and stdParallel2 if necessary on LCC projections (https://github.com/mapgears/mitab/issues/1) --- autotest/ogr/data/lambert93_francais.DAT | Bin 0 -> 66 bytes autotest/ogr/data/lambert93_francais.ID | 0 autotest/ogr/data/lambert93_francais.MAP | Bin 0 -> 1024 bytes autotest/ogr/data/lambert93_francais.TAB | 13 + autotest/ogr/ogr_mitab.py | 36 ++ gdal/ogr/ogrsf_frmts/mitab/mitab_bounds.cpp | 7 +- gdal/ogr/ogrsf_frmts/mitab/mitab_coordsys.cpp | 48 +- .../ogrsf_frmts/mitab/mitab_spatialref.cpp | 460 +++++++++++++++++- 8 files changed, 548 insertions(+), 16 deletions(-) create mode 100644 autotest/ogr/data/lambert93_francais.DAT create mode 100644 autotest/ogr/data/lambert93_francais.ID create mode 100644 autotest/ogr/data/lambert93_francais.MAP create mode 100644 autotest/ogr/data/lambert93_francais.TAB diff --git a/autotest/ogr/data/lambert93_francais.DAT b/autotest/ogr/data/lambert93_francais.DAT new file mode 100644 index 0000000000000000000000000000000000000000..09021c3e68a2bbc861ec42e8e34d48e5186faa38 GIT binary patch literal 66 hcmZQBV&`E10!IdJ5QPEK^7CP0&L9RCj0dH8r2u4j0*wFw literal 0 HcmV?d00001 diff --git a/autotest/ogr/data/lambert93_francais.ID b/autotest/ogr/data/lambert93_francais.ID new file mode 100644 index 000000000..e69de29bb diff --git a/autotest/ogr/data/lambert93_francais.MAP b/autotest/ogr/data/lambert93_francais.MAP new file mode 100644 index 0000000000000000000000000000000000000000..1d5bcd5ef5c5576f33e98019cb3de56d4515d2ae GIT binary patch literal 1024 zcmZSJ;uGZ)lU}rJwUn0r(v@46Z@tMct}HCC4J7@;ljkg1xnRZGB`em7Nm=p=ngbO8 z*_*cA*}M0Pwtnb|GdGT(zHs^a-$RFfG7L?yDZHKO3nK#)#PuKSsp|`N1_nk34~UtH z3=GT+>;-=1&wCaqI^0+cq5I-yEqLA$evmh=pX2@XSqC9%IUK;WgFA#~aD&hd9$@-F zjH)9@K0r4TOoQ0;2FkZ9ZJiRH+U#AaVaMe?(Sb?3-M0VGSDWBar+7a{Usp$;%)Gqf zw44CPAXmQ-1qElv^3>uIARXlD7~<-pU}>srV5Vzi85-aM=bP&qm;}fBI0BU`fc&%I z0-K{B692#(Hb>WZAAdi0h`a)`q+>V|zkx^65vV)f)6W^KpMk;70i+rv05T86cMpzt z_7C+7>4wJm$|ZhwC*@Nd_LNMvaY{(F`8eOtF4Q2!;qlVhV7}#SKf8wx2!7)SyPCG{xcUnKNMdT?_o|_FqbI zkk-Eo*8lsopPluC6o-t7Z^7=h`3}_oHpL-dh#43kr8c!n{&vQ{Qyiu_bKB+%HQVg- S^|xEkkqY#$usProj.nProjId!=0xff; psList++) { - TABProjInfo *p = &(psList->sProj); + const TABProjInfo *p = &(psList->sProj); if (p->nProjId == psCS->nProjId && (p->nUnitsId == 0xff || p->nUnitsId == psCS->nUnitsId) && diff --git a/gdal/ogr/ogrsf_frmts/mitab/mitab_coordsys.cpp b/gdal/ogr/ogrsf_frmts/mitab/mitab_coordsys.cpp index c4090e7d7..8252879e8 100644 --- a/gdal/ogr/ogrsf_frmts/mitab/mitab_coordsys.cpp +++ b/gdal/ogr/ogrsf_frmts/mitab/mitab_coordsys.cpp @@ -118,8 +118,8 @@ #include "mitab.h" #include "mitab_utils.h" -extern MapInfoDatumInfo asDatumInfoList[]; -extern MapInfoSpheroidInfo asSpheroidInfoList[]; +extern const MapInfoDatumInfo asDatumInfoList[]; +extern const MapInfoSpheroidInfo asSpheroidInfoList[]; /************************************************************************/ /* GetMIFParm() */ @@ -650,6 +650,17 @@ OGRSpatialReference *MITABCoordSys2SpatialRef( const char * pszCoordSys ) GetMIFParm( papszNextField, 5, 0.0 )); // dfFalseNorthing break; + /*-------------------------------------------------------------- + * Equidistant Cylindrical / Equirectangular + *-------------------------------------------------------------*/ + case 33: + poSR->SetEquirectangular( + GetMIFParm( papszNextField, 1, 0.0 ), + GetMIFParm( papszNextField, 0, 0.0 ), + GetMIFParm( papszNextField, 2, 0.0 ), + GetMIFParm( papszNextField, 3, 0.0 ) ); + break; + default: break; } @@ -683,7 +694,7 @@ OGRSpatialReference *MITABCoordSys2SpatialRef( const char * pszCoordSys ) /* Find the datum, and collect it's parameters if possible. */ /* -------------------------------------------------------------------- */ int iDatum; - MapInfoDatumInfo *psDatumInfo = NULL; + const MapInfoDatumInfo *psDatumInfo = NULL; for( iDatum = 0; asDatumInfoList[iDatum].nMapInfoDatumID != -1; iDatum++ ) { @@ -786,7 +797,9 @@ OGRSpatialReference *MITABCoordSys2SpatialRef( const char * pszCoordSys ) CPLAtof(SRS_UA_DEGREE_CONV) ); poSR->SetTOWGS84( adfDatumParm[0], adfDatumParm[1], adfDatumParm[2], - -adfDatumParm[3], -adfDatumParm[4], -adfDatumParm[5], + adfDatumParm[3] == 0.0 ? 0.0 : -adfDatumParm[3], + adfDatumParm[4] == 0.0 ? 0.0 : -adfDatumParm[4], + adfDatumParm[5] == 0.0 ? 0.0 : -adfDatumParm[5], adfDatumParm[6] ); /*----------------------------------------------------------------- @@ -798,6 +811,21 @@ OGRSpatialReference *MITABCoordSys2SpatialRef( const char * pszCoordSys ) poSR->SetNode( "PROJCS", "WGS 84 / Pseudo-Mercator" ); poSR->SetExtension( "PROJCS", "PROJ4", "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs" ); } + + /*----------------------------------------------------------------- + * Special case for France Lambert-93 + *----------------------------------------------------------------*/ + if( nBaseProjection == 3 + && nDatum == 33 + && nEllipsoid == 0 + && poSR->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0) == 3.0 + && poSR->GetProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0) == 46.5 ) + { + poSR->SetNode( "PROJCS", "RGF93 / Lambert-93" ); + poSR->SetNode( "PROJCS|GEOGCS", "RGF93"); + poSR->SetNode( "PROJCS|GEOGCS|DATUM", "Reseau_Geodesique_Francais_1993"); + } + /* -------------------------------------------------------------------- */ /* Report on translation. */ /* -------------------------------------------------------------------- */ @@ -1139,6 +1167,16 @@ char *MITABSpatialRef2CoordSys( OGRSpatialReference * poSR ) nParmCount = 6; } + else if( EQUAL(pszProjection,SRS_PT_EQUIRECTANGULAR) ) + { + nProjection = 33; + parms[0] = poSR->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); + parms[1] = poSR->GetProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0); + parms[2] = poSR->GetProjParm(SRS_PP_FALSE_EASTING,0.0); + parms[3] = poSR->GetProjParm(SRS_PP_FALSE_NORTHING,0.0); + nParmCount = 4; + } + /* ============================================================== * Translate Datum and Ellipsoid * ============================================================== */ @@ -1507,7 +1545,7 @@ int MITABCoordSys2TABProjInfo(const char * pszCoordSys, TABProjInfo *psProj) * Find the datum, and collect it's parameters if possible. *----------------------------------------------------------------*/ int iDatum; - MapInfoDatumInfo *psDatumInfo = NULL; + const MapInfoDatumInfo *psDatumInfo = NULL; for(iDatum=0; asDatumInfoList[iDatum].nMapInfoDatumID != -1; iDatum++) { diff --git a/gdal/ogr/ogrsf_frmts/mitab/mitab_spatialref.cpp b/gdal/ogr/ogrsf_frmts/mitab/mitab_spatialref.cpp index bc6939acd..e43d2a53e 100644 --- a/gdal/ogr/ogrsf_frmts/mitab/mitab_spatialref.cpp +++ b/gdal/ogr/ogrsf_frmts/mitab/mitab_spatialref.cpp @@ -217,7 +217,10 @@ /* were added afterwards and may be incomplete or inaccurate. */ /* -------------------------------------------------------------------- */ -MapInfoDatumInfo asDatumInfoList[] = +extern const MapInfoDatumInfo asDatumInfoList[]; +extern const MapInfoSpheroidInfo asSpheroidInfoList[]; + +const MapInfoDatumInfo asDatumInfoList[] = { { 0, 104, "WGS_1984", 28,0, 0, 0, 0, 0, 0, 0, 0}, @@ -259,6 +262,7 @@ MapInfoDatumInfo asDatumInfoList[] = { 6272, 31, "New_Zealand_Geodetic_Datum_1949",4,84, -22, 209, 0, 0, 0, 0, 0}, { 0, 32, "GRS_67", 21,0, 0, 0, 0, 0, 0, 0, 0}, { 0, 33, "GRS_80", 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 6171, 33, "Reseau_Geodesique_Francais_1993",0, 0, 0, 0, 0, 0, 0, 0, 0}, { 6675, 34, "Guam_1963", 7, -100, -248, 259, 0, 0, 0, 0, 0}, { 0, 35, "Gux_1_Astro", 4, 252, -209, -751,0, 0, 0, 0, 0}, { 6254, 36, "Hito_XVIII_1963", 4, 16, 196, 93, 0, 0, 0, 0, 0}, @@ -341,7 +345,8 @@ MapInfoDatumInfo asDatumInfoList[] = { 0, 113, "Lisboa_DLX", 4, -303, -62, 105, 0, 0, 0, 0, 0}, { 0, 114, "Melrica_1973_D73", 4, -223, 110, 37, 0, 0, 0, 0, 0}, { 0, 115, "Euref_98", 0, 0, 0, 0, 0, 0, 0, 0, 0}, -{ 0, 116, "GDA94", 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 6283, 116, "GDA94", 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 6283, 116, "Geocentric_Datum_of_Australia_1994", 0, 0, 0, 0, 0, 0, 0, 0, 0}, { 6167, 117, "NZGD2000", 0, 0, 0, 0, 0, 0, 0, 0, 0}, { 6167, 117, "New_Zealand_Geodetic_Datum_2000",0,0, 0, 0, 0, 0, 0, 0, 0}, { 6169, 118, "America_Samoa", 7, -115, 118, 426, 0, 0, 0, 0, 0}, @@ -410,7 +415,7 @@ MapInfoDatumInfo asDatumInfoList[] = /* manuals. */ /* -------------------------------------------------------------------- */ -MapInfoSpheroidInfo asSpheroidInfoList[] = +const MapInfoSpheroidInfo asSpheroidInfoList[] = { { 9,"Airy 1930", 6377563.396, 299.3249646}, {13,"Airy 1930 (modified for Ireland 1965", 6377340.189, 299.3249646}, @@ -468,7 +473,327 @@ MapInfoSpheroidInfo asSpheroidInfoList[] = {54,"WGS 84 (MAPINFO Datum 157)", 6378137.01, 298.257223563}, {-1,NULL, 0.0, 0.0} }; - + +/* For LCC, standard parallel 1 and 2 can be switched indifferently */ +/* So the MapInfo order and the EPSG order are not generally identical */ +/* which may cause recognition problems when reading in MapInfo */ +/* This table contains the parameters in the order expected by MapInfo */ +typedef struct +{ + int nEPSGCode; + int bReverseStdP; + int nMapInfoDatumID; + double dfCenterLong; + double dfCenterLat; + double dfStdP1; + double dfStdP2; +} MapInfoLCCSRS; + +static const MapInfoLCCSRS asMapInfoLCCSRSList[] = { +{0,0,0,110,10,25,40}, +{0,0,0,132.5,-10,-21.5,-33.5}, +{0,0,0,25,35,40,65}, +{0,0,0,47.5,25,15,35}, +{0,0,0,95,40,20,60}, +{0,0,1002,0,42.165,41.5603877778,42.76766333}, +{0,0,1002,0,42.165,41.5603877778,42.767663333}, +{0,0,1002,0,42.165,41.560387778,42.76766333}, +{0,0,1002,0,42.165,41.560387778,42.767663333}, +{0,0,1002,0,42.165,41.56038778,42.76766333}, +{0,0,1002,0,42.165,41.560387840948,42.76766346965}, +{0,0,1002,0,44.1,43.199291275544,44.996093814511}, +{0,0,1002,0,44.1,43.1992913889,44.99609389}, +{0,0,1002,0,44.1,43.199291389,44.99609389}, +{0,0,1002,0,44.1,43.19929139,44.99609389}, +{0,0,1002,0,46.8,45.8989188889,47.69601444}, +{0,0,1002,0,46.8,45.898918889,47.69601444}, +{0,0,1002,0,46.8,45.89891889,47.69601444}, +{0,0,1002,0,46.8,45.898918964419,47.696014502038}, +{0,0,1002,0,49.5,48.5985227778,50.39591167}, +{0,0,1002,0,49.5,48.598522778,50.39591167}, +{0,0,1002,0,49.5,48.59852278,50.39591167}, +{0,0,1002,0,49.5,48.598522847174,50.395911631678}, +{0,0,1005,23,-23,-18,-32}, +{0,0,1022,2.7,36,37.575,34.425}, +{0,0,104,13.33333333,47.5,46,49}, +{0,0,104,13.33333333,48,46,49}, +{0,0,104,-19,65,64.25,65.75}, +{0,0,104,36.0,25.0,37.5,40.5}, +{0,0,104,36,25,37.5,40.5}, +{0,0,104,70,-50,-68.5,-74.5}, +{0,0,110,4.367975,90,49.8333333333,51.1666666667}, +{0,0,115,10,52,35,45}, +{0,0,116,135,-24,-18,-36}, +{0,0,116,135,-32,-28,-36}, +{0,0,12,135,-24,-18,-36}, +{0,0,12,145,-37,-36,-38}, +{0,0,13,135,-24,-18,-36}, +{0,0,19,23,-23,-18,-32}, +{0,0,28,17,29.77930555,42,56}, +{0,0,28,19,29.77930555,42,56}, +{0,0,28,36.0,25.0,37.5,40.5}, +{0,0,33,13.5,0,52.6666666667,55.3333333333}, +{0,0,33,15,0,56.5,60.5}, +{0,0,33,15,0,58,66}, +{0,0,33,15,0,63.5,67.5}, +{0,0,33,15.5,0,56.6666666667,59.3333333333}, +{0,0,33,15.5,0,60.6666666667,63.3333333333}, +{0,0,33,16.5,0,60.6666666667,63.3333333333}, +{0,0,33,18.5,0,64.6666666667,67.3333333333}, +{0,0,33,19,0,64.6666666667,67.3333333333}, +{0,0,33,3,46.5,44,49}, +{0,0,55,-5.4,22.5,20.9075742561,24.0921050540}, +{0,0,55,-5.4,26.1,24.5075340813,27.6921073632}, +{0,0,55,-5.4,29.7,28.1063294800,31.2932791054}, +{0,0,55,-5.4,33.3,31.72786641202,34.8717272112}, +{0,0,62,-70.5,41,41.2833333333,41.4833333333}, +{0,0,62,-77.75,39.3333333333,39.9333333333,40.9666666667}, +{0,0,62,-91.3333333333,25.6666666667,26.1666666667,27.8333333333}, +{0,0,62,-91.3333333333,28.6666666667,29.3,30.67}, +{0,0,62,-96,23,20,60}, +{0,0,62,-96,23,33,45}, +{0,0,62,-96,39,33,45}, +{0,0,66,-68.5,44,46,60}, +{0,0,74,-100.3333333333,42.3333333333,42.8333333333,44.4}, +{0,0,74,-100,39.8333333333,40,43}, +{0,0,74,-100,43.8333333333,44.4166666667,45.6833333333}, +{0,0,74,-109.5,44.25,45,49}, +{0,0,74,-111.5,36.6666666667,37.2166666667,38.35}, +{0,0,74,-111.5,38.3333333333,39.0166666667,40.65}, +{0,0,74,-111.5,40.3333333333,40.7166666667,41.7833333333}, +{0,0,74,-120.5,41.6666666667,42.3333333333,44}, +{0,0,74,-120.5,43.6666666667,44.3333333333,46}, +{0,0,74,-176,51,51.8333333333,53.8333333333}, +{0,0,74,-66.4333333333,17.8333333333,18.0333333333,18.4333333333}, +{0,0,74,-68.5,44,46,60}, +{0,0,74,-79.5,38.5,39,40.25}, +{0,0,74,-81,31.8333333333,32.5,34.8333333333}, +{0,0,74,-81,37,37.4833333333,38.8833333333}, +{0,0,74,-82.5,38,38.7333333333,40.0333333333}, +{0,0,74,-82.5,39.6666666667,40.4333333333,41.7}, +{0,0,74,-84.25,37.5,37.9666666667,38.9666666667}, +{0,0,74,-84.3666666667,41.5,42.1,43.6666666667}, +{0,0,74,-84.3666666667,43.3166666667,44.1833333333,45.7}, +{0,0,74,-87,44.7833333333,45.4833333333,47.0833333333}, +{0,0,74,-91.3333333333,25.5,26.1666666667,27.8333333333}, +{0,0,74,-91.3333333333,28.5,29.3,30.7}, +{0,0,74,-92,32.6666666667,33.3,34.7666666667}, +{0,0,74,-92,34.3333333333,34.9333333333,36.2333333333}, +{0,0,74,-92.5,30.5,31.1666666667,32.6666666667}, +{0,0,74,-93.1,46.5,47.0333333333,48.6333333333}, +{0,0,74,-93.5,40,40.6166666667,41.7833333333}, +{0,0,74,-93.5,41.5,42.0666666667,43.2666666667}, +{0,0,74,-94.25,45,45.6166666667,47.05}, +{0,0,74,-94,43,43.7833333333,45.2166666667}, +{0,0,74,-98,38.3333333333,38.7166666667,39.7833333333}, +{0,0,74,-98.5,36.6666666667,38.5666666667,37.2666666667}, +{2154,1,33,3,46.5,44,49}, +{2154,1,33,3,46.5,44,49.00000000001}, +{2154,1,33,3,46.5,44,49.00000000002}, +{2225,1,74,-122,39.3333333333,40,41.6666666667}, +{2226,1,74,-122,37.6666666667,38.3333333333,39.8333333333}, +{2227,1,74,-120.5,36.5,37.0666666667,38.4333333333}, +{2228,1,74,-119,35.3333333333,36,37.25}, +{2229,1,74,-118,33.5,34.0333333333,35.4666666667}, +{2230,1,74,-116.25,32.1666666667,32.7833333333,33.8833333333}, +{2231,1,74,-105.5,39.3333333333,39.7166666667,40.7833333333}, +{2232,1,74,-105.5,37.8333333333,38.45,39.75}, +{2233,1,74,-105.5,36.6666666667,37.2333333333,38.4333333333}, +{2234,1,74,-72.75,40.8333333333,41.2,41.8666666667}, +{2238,1,74,-84.5,29,29.5833333333,30.75}, +{2246,0,74,-84.25,37.5,37.9666666667,38.9666666667}, +{2247,1,74,-85.75,36.3333333333,36.7333333333,37.9333333333}, +{2248,1,74,-77,37.6666666667,38.3,39.45}, +{2249,1,74,-71.5,41,41.7166666667,42.6833333333}, +{2250,1,74,-70.5,41,41.2833333333,41.4833333333}, +{2251,1,74,-87,44.7833333333,45.4833333333,47.0833333333}, +{2252,1,74,-84.3666666667,43.3166666667,44.1833333333,45.7}, +{2253,1,74,-84.3666666667,41.5,42.1,43.6666666667}, +{2256,1,74,-109.5,44.25,45,49}, +{2263,1,74,-74,40.1666666667,40.6666666667,41.0333333333}, +{2264,1,74,-79,33.75,34.3333333333,36.1666666667}, +{2265,1,74,-100.5,47,47.4333333333,48.7333333333}, +{2266,1,74,-100.5,45.6666666667,46.1833333333,47.4833333333}, +{2267,1,74,-98,35,35.5666666667,36.7666666667}, +{2268,1,74,-98,33.3333333333,33.9333333333,35.2333333333}, +{2269,1,74,-120.5,43.6666666667,44.3333333333,46}, +{2270,1,74,-120.5,41.6666666667,42.3333333333,44}, +{2271,1,74,-77.75,40.1666666667,40.8833333333,41.95}, +{2272,1,74,-77.75,39.3333333333,39.9333333333,40.9666666667}, +{2273,1,74,-81,31.8333333333,32.5,34.8333333333}, +{2274,1,74,-86,34.3333333333,35.25,36.4166666667}, +{2275,1,74,-101.5,34,34.65,36.1833333333}, +{2276,1,74,-98.5,31.6666666667,32.1333333333,33.9666666667}, +{2277,1,74,-100.3333333333,29.6666666667,30.1166666667,31.8833333333}, +{2278,1,74,-99,27.8333333333,28.3833333333,30.2833333333}, +{2279,1,74,-98.5,25.6666666667,26.1666666667,27.8333333333}, +{2280,1,74,-111.5,40.3333333333,40.7166666667,41.7833333333}, +{2281,1,74,-111.5,38.3333333333,39.0166666667,40.65}, +{2282,1,74,-111.5,36.6666666667,37.2166666667,38.35}, +{2283,1,74,-78.5,37.6666666667,38.0333333333,39.2}, +{2284,1,74,-78.5,36.3333333333,36.7666666667,37.9666666667}, +{2285,1,74,-120.8333333333,47,47.5,48.7333333333}, +{2286,1,74,-120.5,45.3333333333,45.8333333333,47.3333333333}, +{2287,1,74,-90,45.1666666667,45.5666666667,46.7666666667}, +{2288,1,74,-90,43.8333333333,44.25,45.5}, +{2289,1,74,-90,42,42.7333333333,44.0666666667}, +{26740,1,63,-176,51,51.8333333333,53.8333333333}, +{26741,1,62,-122,39.3333333333,40,41.6666666667}, +{26742,1,62,-122,37.6666666667,38.3333333333,39.8333333333}, +{26743,1,62,-120.5,36.5,37.0666666667,38.4333333333}, +{26744,1,62,-119,35.3333333333,36,37.25}, +{26745,1,62,-118,33.5,34.0333333333,35.4666666667}, +{26746,1,62,-116.25,32.1666666667,32.7833333333,33.8833333333}, +{26747,1,62,-118.3333333333,34.1333333333,33.8666666667,34.4166666667}, +{26751,1,62,-92,34.3333333333,34.9333333333,36.2333333333}, +{26752,1,62,-92,32.6666666667,33.3,34.7666666667}, +{26753,0,62,-105.5,39.3333333333,39.7166666667,40.7833333333}, +{26754,1,62,-105.5,37.8333333333,38.45,39.75}, +{26755,1,62,-105.5,36.6666666667,37.2333333333,38.4333333333}, +{26756,1,62,-72.75,40.8333333333,41.2,41.8666666667}, +{26760,1,62,-84.5,29,29.5833333333,30.75}, +{26775,1,62,-93.5,41.5,42.0666666667,43.2666666667}, +{26776,1,62,-93.5,40,40.6166666667,41.7833333333}, +{26777,1,62,-98,38.3333333333,38.7166666667,39.7833333333}, +{26778,0,62,-98.5,36.6666666667,38.5666666667,37.2666666667}, +{26779,0,62,-84.25,37.5,37.9666666667,38.9666666667}, +{26780,0,62,-85.75,36.3333333333,36.7333333333,37.9333333333}, +{26781,0,62,-92.5,30.6666666667,31.1666666667,32.6666666667}, +{26785,0,62,-77,37.8333333333,38.3,39.45}, +{26786,0,62,-71.5,41,41.7166666667,42.6833333333}, +{26788,0,73,-87,44.7833333333,45.4833333333,47.0833333333}, +{26789,0,73,-84.3333333333,43.3166666667,44.1833333333,45.7}, +{26790,0,73,-84.3333333333,41.5,42.1,43.6666666667}, +{26791,0,62,-93.1,46.5,47.0333333333,48.6333333333}, +{26792,0,62,-94.25,45,45.6166666667,47.05}, +{26793,0,62,-94,43,43.7833333333,45.2166666667}, +{26940,1,74,-176,51,51.8333333333,53.8333333333}, +{26941,1,74,-122,39.3333333333,40,41.6666666667}, +{26942,1,74,-122,37.6666666667,38.3333333333,39.8333333333}, +{26943,1,74,-120.5,36.5,37.0666666667,38.4333333333}, +{26944,1,74,-119,35.3333333333,36,37.25}, +{26945,1,74,-118,33.5,34.0333333333,35.4666666667}, +{26946,1,74,-116.25,32.1666666667,32.7833333333,33.8833333333}, +{26951,1,74,-92,34.3333333333,34.9333333333,36.2333333333}, +{26952,1,74,-92,32.6666666667,33.3,34.7666666667}, +{26953,1,74,-105.5,39.3333333333,39.7166666667,40.7833333333}, +{26954,1,74,-105.5,37.8333333333,38.45,39.75}, +{26955,1,74,-105.5,36.6666666667,37.2333333333,38.4333333333}, +{26956,1,74,-72.75,40.8333333333,41.2,41.8666666667}, +{26960,1,74,-84.5,29,29.5833333333,30.75}, +{26975,1,74,-93.5,41.5,42.0666666667,43.2666666667}, +{26976,1,74,-93.5,40,40.6166666667,41.7833333333}, +{26977,1,74,-98,38.3333333333,38.7166666667,39.7833333333}, +{26978,0,74,-98.5,36.6666666667,38.5666666667,37.2666666667}, +{26980,1,74,-85.75,36.3333333333,36.7333333333,37.9333333333}, +{26981,1,74,-92.5,30.5,31.1666666667,32.6666666667}, +{26982,1,74,-91.3333333333,28.5,29.3,30.7}, +{26985,1,74,-77,37.6666666667,38.3,39.45}, +{26986,1,74,-71.5,41,41.7166666667,42.6833333333}, +{26987,1,74,-70.5,41,41.2833333333,41.4833333333}, +{26988,1,74,-87,44.7833333333,45.4833333333,47.0833333333}, +{26989,1,74,-84.3666666667,43.3166666667,44.1833333333,45.7}, +{26990,1,74,-84.3666666667,41.5,42.1,43.6666666667}, +{26991,1,74,-93.1,46.5,47.0333333333,48.6333333333}, +{26992,1,74,-94.25,45,45.6166666667,47.05}, +{26993,1,74,-94,43,43.7833333333,45.2166666667}, +{3111,0,116,145,-37,-36,-38}, +{31370,1,1019,4.3674866667,90,49.8333339000,51.1666672333}, +{32001,1,62,-109.5,47,47.85,48.7166666667}, +{32002,1,62,-109.5,45.8333333333,46.45,47.8833333333}, +{32003,1,62,-109.5,44,44.8666666667,46.4}, +{32005,0,62,-100,41.3333333333,41.85,42.8166666667}, +{32006,0,62,-99.5,39.6666666667,40.2833333333,41.7166666667}, +{32018,1,62,-74,40.5,40.6666666667,41.0333333333}, +{32019,0,62,-79,33.75,34.3333333333,36.1666666667}, +{32020,0,62,-100.5,47,47.4333333333,48.7333333333}, +{32021,0,62,-100.5,45.6666666667,46.1833333333,47.4833333333}, +{32022,0,62,-82.5,39.6666666667,40.4333333333,41.7}, +{32023,0,62,-82.5,38,38.7333333333,40.0333333333}, +{32024,0,62,-98,35,35.5666666667,36.7666666667}, +{32025,0,62,-98,33.3333333333,33.9333333333,35.2333333333}, +{32026,0,62,-120.5,43.6666666667,44.3333333333,46}, +{32027,0,62,-120.5,41.6666666667,42.3333333333,44}, +{32028,0,62,-77.75,40.1666666667,40.8833333333,41.95}, +{32031,0,62,-81,33,33.7666666667,34.9666666667}, +{32033,0,62,-81,31.8333333333,32.3333333333,33.6666666667}, +{32034,0,62,-100,43.8333333333,44.4166666667,45.6833333333}, +{32035,0,62,-100.3333333333,42.3333333333,42.8333333333,44.4}, +{32036,0,62,-86,34.6666666667,35.25,36.4166666667}, +{32037,0,62,-101.5,34,34.65,36.1833333333}, +{32038,0,62,-97.5,31.6666666667,32.1333333333,33.9666666667}, +{32039,0,62,-100.3333333333,29.6666666667,30.1166666667,31.8833333333}, +{32040,0,62,-99,27.8333333333,28.3833333333,30.2833333333}, +{32041,0,62,-98.5,25.6666666667,26.1666666667,27.8333333333}, +{32042,0,62,-111.5,40.3333333333,40.7166666667,41.7833333333}, +{32043,0,62,-111.5,38.3333333333,39.0166666667,40.65}, +{32044,0,62,-111.5,36.6666666667,37.2166666667,38.35}, +{32046,0,62,-78.5,37.6666666667,38.0333333333,39.2}, +{32047,0,62,-78.5,36.3333333333,36.7666666667,37.9666666667}, +{32048,0,62,-120.8333333333,47,47.5,48.7333333333}, +{32049,0,62,-120.5,45.3333333333,45.8333333333,47.3333333333}, +{32050,0,62,-79.5,38.5,39,40.25}, +{32051,0,62,-81,37,37.4833333333,38.8833333333}, +{32052,0,62,-90,45.1666666667,45.5666666667,46.7666666667}, +{32053,0,62,-90,43.8333333333,44.25,45.5}, +{32054,0,62,-90,42,42.7333333333,44.0666666667}, +{32059,0,62,-66.4333333333,18.4333333333,18.0333333333,18.4333333333}, +{32060,0,62,-66.4333333333,18.4333333333,18.0333333333,18.4333333333}, +{32100,1,74,-109.5,44.25,45,49}, +{32104,1,74,-100,39.8333333333,40,43}, +{32118,1,74,-74,40.1666666667,40.6666666667,41.0333333333}, +{32119,1,74,-79,33.75,34.3333333333,36.1666666667}, +{32120,1,74,-100.5,47,47.4333333333,48.7333333333}, +{32121,1,74,-100.5,45.6666666667,46.1833333333,47.4833333333}, +{32122,1,74,-82.5,39.6666666667,40.4333333333,41.7}, +{32123,1,74,-82.5,38,38.7333333333,40.0333333333}, +{32124,1,74,-98,35,35.5666666667,36.7666666667}, +{32125,1,74,-98,33.3333333333,33.9333333333,35.2333333333}, +{32126,1,74,-120.5,43.6666666667,44.3333333333,46}, +{32127,1,74,-120.5,41.6666666667,42.3333333333,44}, +{32128,1,74,-77.75,40.1666666667,40.8833333333,41.95}, +{32129,1,74,-77.75,39.3333333333,39.9333333333,40.9666666667}, +{32133,1,74,-81,31.8333333333,32.5,34.8333333333}, +{32134,1,74,-100,43.8333333333,44.4166666667,45.6833333333}, +{32135,1,74,-100.3333333333,42.3333333333,42.8333333333,44.4}, +{32136,1,74,-86,34.3333333333,35.25,36.4166666667}, +{32137,1,74,-101.5,34,34.65,36.1833333333}, +{32138,1,74,-98.5,31.6666666667,32.1333333333,33.9666666667}, +{32139,1,74,-100.3333333333,29.6666666667,30.1166666667,31.8833333333}, +{32140,1,74,-99,27.8333333333,28.3833333333,30.2833333333}, +{32141,1,74,-98.5,25.6666666667,26.1666666667,27.8333333333}, +{32142,1,74,-111.5,40.3333333333,40.7166666667,41.7833333333}, +{32143,1,74,-111.5,38.3333333333,39.0166666667,40.65}, +{32144,1,74,-111.5,36.6666666667,37.2166666667,38.35}, +{32146,1,74,-78.5,37.6666666667,38.0333333333,39.2}, +{32147,1,74,-78.5,36.3333333333,36.7666666667,37.9666666667}, +{32148,1,74,-120.8333333333,47,47.5,48.7333333333}, +{32149,1,74,-120.5,45.3333333333,45.8333333333,47.3333333333}, +{32150,1,74,-79.5,38.5,39,40.25}, +{32151,1,74,-81,37,37.4833333333,38.8833333333}, +{32152,1,74,-90,45.1666666667,45.5666666667,46.7666666667}, +{32153,1,74,-90,43.8333333333,44.25,45.5}, +{32154,1,74,-90,42,42.7333333333,44.0666666667}, +{32161,1,74,-66.4333333333,17.8333333333,18.0333333333,18.4333333333}, +{3300,1,115,24,57.51755394,58,59.33333333}, +{3301,1,115,24,57.51755393056,58,59.33333333}, +{3797,0,66,-70,44,50,46}, +{3798,0,74,-70,44,50,46}, +{3799,0,74,-70,44,50,46}, +{3942,0,33,3,42,41.25,42.75}, +{3943,0,33,3,43,42.25,43.75}, +{3944,0,33,3,44,43.25,44.75}, +{3945,0,33,3,45,44.25,45.75}, +{3946,0,33,3,46,45.25,46.75}, +{3947,0,33,3,47,46.25,47.75}, +{3948,0,33,3,48,47.25,48.75}, +{3949,0,33,3,49,48.25,49.75}, +{3950,0,33,3,50,49.25,50.75}, +{42101,0,104,-95,0,49,77}, +{42103,0,104,-100,0,33,45}, +{42304,0,74,-95,49,49,77}, +}; + /********************************************************************** * TABFile::GetSpatialRef() * @@ -909,6 +1234,16 @@ OGRSpatialReference *TABFile::GetSpatialRef() sTABProj.adProjParams[5] ); // dfFalseNorthing break; + /*-------------------------------------------------------------- + * Equidistant Cylindrical / Equirectangular + *-------------------------------------------------------------*/ + case 33: + m_poSpatialRef->SetEquirectangular( sTABProj.adProjParams[1], + sTABProj.adProjParams[0], + sTABProj.adProjParams[2], + sTABProj.adProjParams[3] ); + break; + default: break; } @@ -945,7 +1280,7 @@ OGRSpatialReference *TABFile::GetSpatialRef() #define TAB_EQUAL(a, b) (((a)<(b) ? ((b)-(a)) : ((a)-(b))) < 1e-10) char szDatumName[160]; int iDatumInfo; - MapInfoDatumInfo *psDatumInfo = NULL; + const MapInfoDatumInfo *psDatumInfo = NULL; for( iDatumInfo = 0; asDatumInfoList[iDatumInfo].nMapInfoDatumID != -1; @@ -1004,6 +1339,44 @@ OGRSpatialReference *TABFile::GetSpatialRef() { strncpy( szDatumName, psDatumInfo->pszOGCDatumName, sizeof(szDatumName) ); + + /* For LCC, standard parallel 1 and 2 can be switched indifferently */ + /* So the MapInfo order and the EPSG order are not generally identical */ + /* which may cause recognition problems when reading in MapInfo */ + if( sTABProj.nProjId == 3 ) + { + double dfCenterLong = sTABProj.adProjParams[0]; + double dfCenterLat = sTABProj.adProjParams[1]; + double dfStdP1 = sTABProj.adProjParams[2]; + double dfStdP2 = sTABProj.adProjParams[3]; + + for(size_t i=0;iSetLCC( sTABProj.adProjParams[3], + sTABProj.adProjParams[2], + sTABProj.adProjParams[1], + sTABProj.adProjParams[0], + sTABProj.adProjParams[4], + sTABProj.adProjParams[5] ); + } + if( asMapInfoLCCSRSList[i].nEPSGCode > 0 ) + m_poSpatialRef->SetAuthority( "PROJCS", "EPSG", + asMapInfoLCCSRSList[i].nEPSGCode ); + break; + } + } + } + } } else { @@ -1081,6 +1454,20 @@ OGRSpatialReference *TABFile::GetSpatialRef() m_poSpatialRef->SetExtension( "PROJCS", "PROJ4", "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs" ); } + /*----------------------------------------------------------------- + * Special case for France Lambert-93 + *----------------------------------------------------------------*/ + if( sTABProj.nProjId == 3 + && sTABProj.nDatumId == 33 + && sTABProj.nEllipsoidId == 0 + && TAB_EQUAL(m_poSpatialRef->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0), 3.0) + && TAB_EQUAL(m_poSpatialRef->GetProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0), 46.5) ) + { + m_poSpatialRef->SetNode( "PROJCS", "RGF93 / Lambert-93" ); + m_poSpatialRef->SetNode( "PROJCS|GEOGCS", "RGF93"); + m_poSpatialRef->SetNode( "PROJCS|GEOGCS|DATUM", "Reseau_Geodesique_Francais_1993"); + } + return m_poSpatialRef; } @@ -1436,11 +1823,20 @@ int TABFile::SetSpatialRef(OGRSpatialReference *poSpatialRef) parms[5] = poSpatialRef->GetProjParm(SRS_PP_FALSE_NORTHING,0.0); } + else if( EQUAL(pszProjection,SRS_PT_EQUIRECTANGULAR) ) + { + sTABProj.nProjId = 33; + parms[0] = poSpatialRef->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0); + parms[1] = poSpatialRef->GetProjParm(SRS_PP_LATITUDE_OF_ORIGIN,0.0); + parms[2] = poSpatialRef->GetProjParm(SRS_PP_FALSE_EASTING,0.0); + parms[3] = poSpatialRef->GetProjParm(SRS_PP_FALSE_NORTHING,0.0); + } + /* ============================================================== * Translate Datum and Ellipsoid * ============================================================== */ const char *pszWKTDatum = poSpatialRef->GetAttrValue("DATUM"); - MapInfoDatumInfo *psDatumInfo = NULL; + const MapInfoDatumInfo *psDatumInfo = NULL; int nDatumEPSGCode = -1; const char *pszDatumAuthority = poSpatialRef->GetAuthorityName("DATUM"); @@ -1456,6 +1852,8 @@ int TABFile::SetSpatialRef(OGRSpatialReference *poSpatialRef) *----------------------------------------------------------------*/ if( pszWKTDatum == NULL ) { + CPLDebug("MITAB", "Cannot find MapInfo datum matching %d. Defaulting to WGS 84", + nDatumEPSGCode); psDatumInfo = asDatumInfoList+0; /* WGS 84 */ } @@ -1479,7 +1877,11 @@ int TABFile::SetSpatialRef(OGRSpatialReference *poSpatialRef) } if( psDatumInfo == NULL ) + { + CPLDebug("MITAB", "Cannot find MapInfo datum matching %s. Defaulting to WGS 84", + pszWKTDatum); psDatumInfo = asDatumInfoList+0; /* WGS 84 */ + } } /*----------------------------------------------------------------- @@ -1511,7 +1913,11 @@ int TABFile::SetSpatialRef(OGRSpatialReference *poSpatialRef) } if( CSLCount(papszFields) < 5 ) - psDatumInfo = asDatumInfoList+0; /* WKS84 */ + { + CPLDebug("MITAB", "Cannot find MapInfo datum matching %s. Defaulting to WGS 84", + pszWKTDatum); + psDatumInfo = asDatumInfoList+0; /* WGS 84 */ + } CSLDestroy( papszFields ); } @@ -1535,8 +1941,12 @@ int TABFile::SetSpatialRef(OGRSpatialReference *poSpatialRef) } } - if( psDatumInfo == NULL ) + if( psDatumInfo == NULL ) + { + CPLDebug("MITAB", "Cannot find MapInfo datum matching %s,%d. Defaulting to WGS 84", + pszWKTDatum, nDatumEPSGCode); psDatumInfo = asDatumInfoList+0; /* WGS 84 */ + } } if( psDatumInfo != NULL ) @@ -1551,6 +1961,40 @@ int TABFile::SetSpatialRef(OGRSpatialReference *poSpatialRef) sTABProj.adDatumParams[2] = psDatumInfo->dfDatumParm2; sTABProj.adDatumParams[3] = psDatumInfo->dfDatumParm3; sTABProj.adDatumParams[4] = psDatumInfo->dfDatumParm4; + + /* For LCC, standard parallel 1 and 2 can be switched indifferently */ + /* So the MapInfo order and the EPSG order are not generally identical */ + /* which may cause recognition problems when reading in MapInfo */ + if( sTABProj.nProjId == 3 ) + { + double dfCenterLong = parms[0]; + double dfCenterLat = parms[1]; + double dfStdP1 = parms[2]; + double dfStdP2 = parms[3]; + + for(size_t i=0;i