/* * make_region4.c : Make 'region4.asc' * region 4 : similar to region_code.asc, but * [1]the area in Russia easter than Ob * drainage basin is divided into Asia, not Europe. * * [2]Whole New Guinea Island is classified into Oceania * (Indonesia(360) && ((lat>-5 && lon>131) || lon>135)) * * [3]Central America(3) in regin_code.asc is included in * North America(4) */ #include #include "common.h" #include "common.c" /* ============== FILE NAMES ===================*/ #define COUNTRY_CODE_FILE "country_code.txt" #define REGION_CODE_FILE_ORIGINAL "region_code.txt" #define COUNTRY_CODE_MAP "country_code.asc" #define REGION_CODE_MAP "region_code.asc" #define RIVER_CODE_MAP "rivnum.asc" #define RESULT_MAP "region_code4.asc" /* ================= CODE / NAME =================*/ #define RIVNUM_OB 6 /* River Number of Ob */ #define REGION_NAME_ASIA "ASIA" #define REGION_NAME_OCEANIA "OCEANIA" #define REGION_NAME_C_AMERICA "CENTRAL_AMERICA" #define REGION_NAME_N_AMERICA "NORTH_AMERICA" #define COUNTRY_NAME_RUSSIA "Russian_Federation" #define COUNTRY_NAME_INDONESIA "Indonesia" /* *===================================================== * main *===================================================== */ main(int iArgc, char **ppszArgv){ int i; int iX, iY; int iData, iRiver; INT_GRID *grdCountry, *grdRegion, *grdRiver; int *iCount; int g_iRegion_Asia, g_iRegion_Oceania; int g_iRegion_C_America, g_iRegion_N_America; int g_iCountry_Russia, g_iCountry_Indonesia; int g_iRiver_Ob; /* * Init */ DBGPUTS("init"); initialize(-180.0); iCount = (int *)calloc(g_iNumOfRegions, sizeof(int)); /* * Country Code */ DBGPUTS("read_tables"); ReadCountryTable(COUNTRY_CODE_FILE); ReadRegionTable(REGION_CODE_FILE_ORIGINAL); DBGPUTS("init_grids"); grdRegion = (INT_GRID *)init_every(ARRAYTYPE_INT_GRID); grdCountry = (INT_GRID *)init_every(ARRAYTYPE_INT_GRID); grdRiver = (INT_GRID *)init_every(ARRAYTYPE_INT_GRID); /* Read country_map and region_map */ DBGPUTS("read_grids"); ReadIntASC(REGION_CODE_MAP, grdRegion); ReadIntASC(COUNTRY_CODE_MAP, grdCountry); ReadIntASC(RIVER_CODE_MAP , grdRiver); /* */ g_iRegion_Asia = GetRegionCodeFromName(REGION_NAME_ASIA); g_iRegion_Oceania = GetRegionCodeFromName(REGION_NAME_OCEANIA); g_iRegion_C_America = GetRegionCodeFromName(REGION_NAME_C_AMERICA); g_iRegion_N_America = GetRegionCodeFromName(REGION_NAME_N_AMERICA); g_iCountry_Russia = GetCountryCodeFromName(COUNTRY_NAME_RUSSIA); g_iCountry_Indonesia = GetCountryCodeFromName(COUNTRY_NAME_INDONESIA); g_iRiver_Ob = RIVNUM_OB; /* TODO : GetRiverCodeFromName(RIVER_NAME_OB); */ /* prepare the counter */ for(i = 0; i < g_iNumOfRegions; i++) g_pRegion_table[i].iNumOfGrids = 0; /* modify region_map and count */ for(iY = 0; iY < g_iNumOfYGrids; iY++){ for(iX = 0; iX < g_iNumOfXGrids; iX++){ iData = (grdCountry -> pGrid)[iY][iX]; iRiver = (grdRiver -> pGrid)[iY][iX]; /* Collection [1] =========================================== for Russia, Obi river basin and region easter than 68E is classified into Asia */ if (iData == g_iCountry_Russia && ((CalcLon(iX) > 68 || CalcLon(iX) < 0) || iRiver == RIVNUM_OB)) (grdRegion -> pGrid)[iY][iX] = g_iRegion_Asia; /* Collection [2] =========================================== for Indonesia, the island of New Guinea is classified into Oceania, not Asia. Criteria is ((lat>-5 and lon>131) or lon>135) */ if (iData == g_iCountry_Indonesia && ((CalcLon(iX) > 131 && CalcLat(iY) > -5) || CalcLon(iX) > 135)) (grdRegion -> pGrid)[iY][iX] = g_iRegion_Oceania; /* Collection [3] =========================================== "Central America" now included in "Notrh America" */ if ((grdRegion -> pGrid)[iY][iX] == g_iRegion_C_America) (grdRegion -> pGrid)[iY][iX] = g_iRegion_N_America; /* Counter increment */ iData = (grdRegion -> pGrid)[iY][iX]; for (i = 0; i < g_iNumOfRegions; i++){ if (g_pRegion_table[i].iCode == iData ) break; } if (i < g_iNumOfRegions) g_pRegion_table[i].iNumOfGrids++; } } /* write region_map */ WriteIntASC(RESULT_MAP, grdRegion, 6); /* write grid count */ for (i = 0; i < g_iNumOfRegions; i++) if (g_pRegion_table[i].iNumOfGrids > 0) printf("%4d%28s%8d%8d\n", (g_pRegion_table[i]).iCode, (g_pRegion_table[i]).pszName, (g_pRegion_table[i]).iCode2, (g_pRegion_table[i].iNumOfGrids)); /* * Finish */ terminate(); free(iCount); }