protected string FormatUrl()

in SupportingScripts/Runtime/Scripts/MapRenderer/TextureTileLayers/HttpTextureTileLayer.cs [91:163]


        protected string FormatUrl(TileId tileId)
        {
            var tilePosition = tileId.ToTilePosition();

            var urlStringBuilder = new System.Text.StringBuilder(_urlFormatString.Length);

            var startIndex = 0;
            var lastEndIndex = 0;
            while ((startIndex = _urlFormatString.IndexOf('{', startIndex)) >= 0)
            {
                urlStringBuilder.Append(_urlFormatString, lastEndIndex, startIndex - lastEndIndex);

                var placeholderStartIndex = startIndex + 1;
                var endIndex = _urlFormatString.IndexOf('}', placeholderStartIndex);
                var placeholderCount = endIndex - startIndex - 1;

                if (endIndex == -1)
                {
                    // Couldn't find a closing '}'. Keep it in the resulting URL, but it's probably malformed already.
                    lastEndIndex = startIndex;
                    break;
                }

                if (placeholderCount > 0)
                {
                    if (string.Compare(_urlFormatString, placeholderStartIndex, "x", 0, placeholderCount, StringComparison.OrdinalIgnoreCase) == 0)
                    {
                        urlStringBuilder.Append(tilePosition.X.ToString(CultureInfo.InvariantCulture));
                    }
                    else if (string.Compare(_urlFormatString, placeholderStartIndex, "y", 0, placeholderCount, StringComparison.OrdinalIgnoreCase) == 0)
                    {
                        urlStringBuilder.Append(tilePosition.Y.ToString(CultureInfo.InvariantCulture));
                    }
                    else if (string.Compare(_urlFormatString, placeholderStartIndex, "z", 0, placeholderCount, StringComparison.OrdinalIgnoreCase) == 0 ||
                        string.Compare(_urlFormatString, placeholderStartIndex, "zoom", 0, placeholderCount, StringComparison.OrdinalIgnoreCase) == 0 ||
                        string.Compare(_urlFormatString, placeholderStartIndex, "zoomlevel", 0, placeholderCount, StringComparison.OrdinalIgnoreCase) == 0)
                    {
                        urlStringBuilder.Append(tilePosition.LevelOfDetail.Value.ToString(CultureInfo.InvariantCulture));
                    }
                    else if (string.Compare(_urlFormatString, placeholderStartIndex, "quadkey", 0, placeholderCount, StringComparison.OrdinalIgnoreCase) == 0)
                    {
                        urlStringBuilder.Append(tileId.ToKey());
                    }
                    else if (string.Compare(_urlFormatString, placeholderStartIndex, "subdomain", 0, placeholderCount, StringComparison.OrdinalIgnoreCase) == 0)
                    {
                        if (_subdomains != null && _subdomains.Count > 0)
                        {
                            var subdomain = _subdomains[_subdomainCounter % _subdomains.Count];
                            _subdomainCounter++;

                            urlStringBuilder.Append(subdomain);
                        }
                        else
                        {
                            if (!_hasWarnedMissingSubdomain)
                            {
                                _hasWarnedMissingSubdomain = true;
                                Debug.LogWarning("URL uses a {subdomain} format specified but no subdomains were provided: " + _urlFormatString);
                            }
                            return null;
                        }
                    }
                }

                startIndex = endIndex + 1;
                lastEndIndex = startIndex;
            }

            urlStringBuilder.Append(_urlFormatString, lastEndIndex, _urlFormatString.Length - lastEndIndex);

            var formattedUrl = urlStringBuilder.ToString();
            return formattedUrl;
        }