/*@Nonnull*/ private static Point decodeNameless(string str, int firstrec, string extrapostfix, Data mapcoderData) { String result = str; if (mapcoderData.Codex == 22) { result = result.Substring(0, 3) + result.Substring(4); } else { result = result.Substring(0, 2) + result.Substring(3); } int a = Common.CountCityCoordinatesForCountry(mapcoderData.Codex, firstrec, firstrec); if (a < 2) { a = 1; // paranoia } int p = 31 / a; int r = 31 % a; int v = 0; int nrX; bool swapletters = false; if (mapcoderData.Codex != 21 && a <= 31) { int offset = decode_chars[(int)result[0]]; if (offset < r * (p + 1)) { nrX = offset / (p + 1); } else { swapletters = p == 1 && mapcoderData.Codex == 22; nrX = r + (offset - r * (p + 1)) / p; } } else if (mapcoderData.Codex != 21 && a < 62) { nrX = decode_chars[(int)result[0]]; if (nrX < (62 - a)) { swapletters = mapcoderData.Codex == 22; } else { nrX = nrX + nrX - 62 + a; } } else { // codex==21 || A>=62 int basePower = (mapcoderData.Codex == 21) ? 961 * 961 : 961 * 961 * 31; int basePowerA = basePower / a; if (a == 62) { basePowerA++; } else { basePowerA = 961 * (basePowerA / 961); } // decode and determine x v = fastDecode(result); nrX = v / basePowerA; v %= basePowerA; } if (swapletters && !Data.GetIsSpecialShape(firstrec + nrX)) { result = result.Substring(0, 2) + result[3] + result[2] + result[4]; } if (mapcoderData.Codex != 21 && a <= 31) { v = fastDecode(result); if (nrX > 0) { v -= (nrX * p + (nrX < r ? nrX : r)) * 961 * 961; } } else if (mapcoderData.Codex != 21 && a < 62) { v = fastDecode(result.Substring(1)); if (nrX >= (62 - a) && v >= (16 * 961 * 31)) { v -= 16 * 961 * 31; nrX++; } } if (nrX > a) { return(Point.undefined()); // return undefined (past end!) } mapcoderData.dataSetup(firstrec + nrX); int side = DataAccess.SmartDiv(firstrec + nrX); int xSIDE = side; int maxy = mapcoderData.MapcoderRect.getMaxY(); int minx = mapcoderData.MapcoderRect.getMinX(); int miny = mapcoderData.MapcoderRect.getMinY(); int dx; int dy; if (mapcoderData.IsSpecialShape) { xSIDE *= side; side = 1 + (maxy - miny) / 90; xSIDE = xSIDE / side; Point d = decode6(v, xSIDE, side); dx = d.getLonMicroDeg(); dy = side - 1 - d.getLatMicroDeg(); } else { dy = v % side; dx = v / side; } if (dx >= xSIDE) // else out-of-range! { return(Point.undefined()); // return undefined (out of range!) } int dividerx4 = Common.XDivider(miny, maxy); // 4 times too large! int dividery = 90; int cornerx = minx + (dx * dividerx4) / 4; // FIRST multiply, THEN // divide! int cornery = maxy - dy * dividery; return(add2res(cornery, cornerx, dividerx4, dividery, -1, extrapostfix)); }