示例#1
0
        /*@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));
        }