radioman / greatmaps

GMap.NET - Great Maps for Windows Forms & Presentation
912 stars 408 forks source link

No grayscale in WPF? #123

Open masiton opened 5 years ago

masiton commented 5 years ago

It seems the WPF version is lacking the option to use negative and grayscale effects. Can this please be introduced?

magnumata commented 5 years ago

Had the same problem, resolved by making my own MapProvider with grayscale styling:

using System; using GMap.NET;

namespace ParkingSpace.IndustrialSolution.Map { ///

/// Stylized Google-map provider(Silver style); /// public class GoogleGrayscaleMapProvider : GMap.NET.MapProviders.GoogleMapProviderBase { public static readonly GoogleGrayscaleMapProvider Instance;

    GoogleGrayscaleMapProvider()
    {
    }

    static GoogleGrayscaleMapProvider()
    {
        Instance = new GoogleGrayscaleMapProvider();
    }

    public string Version = "m@333000000";

    #region GMapProvider Members

    readonly Guid id = new Guid("48C90477-4EF8-460D-8AAA-681B0EF640F2");
    public override Guid Id
    {
        get
        {
            return id;
        }
    }

    readonly string name = "GoogleMapGrayscale";
    public override string Name
    {
        get
        {
            return name;
        }
    }

    public override PureImage GetTileImage(GPoint pos, int zoom)
    {
        try
        {
            string url = MakeTileImageUrl(pos, zoom, LanguageStr);
            return GetTileImageUsingHttp(url);
        }
        catch (Exception e)
        {
            return null;
        }
    }

    #endregion

    void GetSecureWords(GPoint pos, out string sec1, out string sec2)
    {
        sec1 = string.Empty; // after &x=...
        sec2 = string.Empty; // after &zoom=...
        int seclen = (int)((pos.X * 3) + pos.Y) % 8;
        sec2 = SecureWord.Substring(0, seclen);

        if (pos.Y >= 10000 && pos.Y < 100000)
        {
            sec1 = Sec1;
        }
    }

    static readonly string Sec1 = "&s=";

    string MakeTileImageUrl(GPoint pos, int zoom, string language)
    {
        string sec1 = string.Empty; // after &x=...
        string sec2 = string.Empty; // after &zoom=...
        GetSecureWords(pos, out sec1, out sec2);

        return string.Format(UrlFormat, UrlFormatServer, GetServerNum(pos, 4), UrlFormatRequest, Version, language, pos.X, sec1, pos.Y, zoom, sec2, Server, apiStyle);
    }

    static readonly string UrlFormatServer = "mt";
    static readonly string UrlFormatRequest = "vt";
    static readonly string UrlFormat = "https://{0}{1}.{10}/maps/{2}/lyrs={3}&hl={4}&x={5}{6}&y={7}&z={8}&s={9}&{11}";

    //styling docs: https://stackoverflow.com/questions/29692737/customizing-google-map-tile-server-url
    static readonly string apiStyle = "apistyle=" +
                                      "s.t:0|s.e:g|p.c:fff5f5f5," + //geometry
                                      "s.t:0|s.e:l.i|p.v:off," + //labels.icon off
                                      "s.t:0|s.e:l.t.f|p.c:ff616161," + //labels.text.fill
                                      "s.t:0|s.e:l.t.s|p.c:fff5f5f5," + //labels.text.stroke
                                      "s.t:21|s.e:l.t.f|p.c:ffbdbdbd," + //administrative.land_parcel - labels.text.fill
                                      "s.t:2|s.e:g|p.c:ffeeeeee," + //poi - geometry
                                      "s.t:2|s.e:l.t.f|p.c:ff757575," + //poi - labels.text.fill
                                      "s.t:40|s.e:g|p.c:ffe5e5e5," + //poi.park - geometry
                                      "s.t:40|s.e:l.t.f|p.c:ff9e9e9e," + //poi.park - labels.text.fill
                                      "s.t:3|s.e:g|p.c:ffffffff," + //road - geometry
                                      "s.t:50|s.e:l.t.f|p.c:ff757575," + //road.arterial - labels.text.fill
                                      "s.t:49|s.e:g|p.c:ffdadada," + //road.highway - geometry
                                      "s.t:49|s.e:l.t.f|p.c:ff616161," + //road.highway - labels.text.fill
                                      "s.t:51|s.e:l.t.f|p.c:ff9e9e9e," + //road.local - labels.text.fill
                                      "s.t:65|s.e:g|p.c:ffe5e5e5," + //transit.line - geometry
                                      "s.t:66|s.e:g|p.c:ffeeeeee," + //transit.station - geometry
                                      "s.t:6|s.e:g|p.c:ffc9c9c9," + //water - geometry
                                      "s.t:6|s.e:l.t.f|p.c:ff9e9e9e" //water - labels.text.fill
        ;
}

}