Code Monkey home page Code Monkey logo

oxyplot-cartography's Introduction

OxyPlot.Cartography

OxyPlot is a plotting library for .NET. This is an unofficial library for cartography and maps plotting.

example-openstreetmap

Usage

See the SimpleDemo for more details. The below example is implemented using Avalonia, but it will be very similar for other platforms.

var model = new PlotModel
{
	IsLegendVisible = true,
	PlotType = PlotType.Cartesian
};

model.Legends.Add(new Legend
{
	LegendPlacement = LegendPlacement.Inside,
	LegendPosition = LegendPosition.RightTop,
	LegendBackground = OxyColor.FromAColor(200, OxyColors.White),
	LegendBorder = OxyColors.Black,
});

model.Axes.Add(new LongitudeAxis
{
	Position = AxisPosition.Bottom,
	Minimum = -0.24,
	Maximum = 0.04,
	Title = "Longitude",
});

model.Axes.Add(new LatitudeWebMercatorAxis
{
	Position = AxisPosition.Left,
	Minimum = 51.42,
	Maximum = 51.62,
	Title = "Latitude"
});

var tileMapImageProvider = new HttpTileMapImageProvider(SynchronizationContext.Current)
{
	Url = "https://server.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/tile/{Z}/{Y}/{X}",
	MaxNumberOfDownloads = 2,
	UserAgent = "OxyPlot.Cartography",
	ImageConverter = new Func<byte[], byte[]>(bytes => // Optional
	{
		if (bytes.Length >= 2 && bytes[0] == 0x42 && bytes[1] == 0x4D)
		{
			return bytes; // Bmp
		}

		if (bytes.Length >= 4 && bytes[0] == 0x89 && bytes[1] == 0x50 && bytes[2] == 0x4E && bytes[3] == 0x47)
		{
			return bytes; //Png
		}

		using (var msInput = new MemoryStream(bytes))
		using (var msOutput = new MemoryStream())
		{
			var bitmap = Bitmap.DecodeToWidth(msInput, 256);
			bitmap.Save(msOutput);
			return msOutput.ToArray();
		}
		return bytes;
	})
};

var loadingImg = new Uri("avares://SimpleDemo/Assets/live-view.png");
var asset = AvaloniaLocator.Current.GetService<IAssetLoader>();
using (var streamImg = asset.Open(loadingImg))
{
	// Add the tile map annotation
	model.Annotations.Add(new MapTileAnnotation(streamImg, tileMapImageProvider)
	{
		CopyrightNotice = "OpenStreetMap",
		MinZoomLevel = 0,
		MaxZoomLevel = 19, // max OpenStreetMap value
		IsTileGridVisible = true,
		TileGridThickness = 3
	});
}

Map Tiles

MapTileAnnotation

example-arcgisonline-sat

Usage

model.Annotations.Add(new MapTileAnnotation(streamImg, tileMapImageProvider)
{
	CopyrightNotice = "OpenStreetMap",
	MinZoomLevel = 0,
	MaxZoomLevel = 19, // max OpenStreetMap value
	IsTileGridVisible = true,
	TileGridThickness = 3
});

Setting a tile loading image

loading_images

Usage (Avalonia)
var loadingImg = new Uri("avares://SimpleDemo/Assets/live-view.png");
var asset = AvaloniaLocator.Current.GetService<IAssetLoader>();
using (var streamImg = asset.Open(loadingImg))
{
	// Add the tile map annotation
	model.Annotations.Add(new MapTileAnnotation(streamImg, tileMapImageProvider)
	{
		CopyrightNotice = "OpenStreetMap",
		MinZoomLevel = 0,
		MaxZoomLevel = 19, // max OpenStreetMap value
		IsTileGridVisible = true,
		TileGridThickness = 3
	});
}

Axis

LatitudeWebMercatorAxis

Map tiles are rendered as true squares, axis is not linear. You can use it in combination with LongitudeAxis, which is basically a LinearAxis.

Spherical Pseudo-Mercator projection
Most of OSM, including the main tiling system, uses a Pseudo-Mercator projection where the Earth is modelized as if it was a perfect a sphere. Combined with the zoom level, the system is known as a Web Mercator on Wikipedia.
This produces a fast approximation to the truer, but heavier elliptical projection, where the Earth would be projected on a more accurate ellipsoid (flattened on poles). As a consequence, direct mesurements of distances in this projection will be approximative, except on the Equator, and the aspect ratios on the rendered map for true squares measured on the surface on Earth will slightly change with latitude and angles not so precisely preserved by this spherical projection. https://wiki.openstreetmap.org/wiki/Mercator example-openstreetmap-latitude-mercator-axis

Usage

model.Axes.Add(new LatitudeWebMercatorAxis
{
	Position = AxisPosition.Left,
	Minimum = 51.42,
	Maximum = 51.62,
	Title = "Latitude"
});

Label formating

Default

e.g. 48.86°N, 02.35°E

Degrees Minutes Seconds (DMS) Coordinates System

e.g. 38°53′23″N, 77°00′32″W

model.Axes.Add(new LongitudeAxis
{
	Position = AxisPosition.Bottom,
	Minimum = -0.24,
	Maximum = 0.04,
	Title = "Longitude",
	LabelFormatter = (decDegrees) => CartographyHelper.DecimalDegreesToDegreesMinutesSeconds(decDegrees, false, 3)
});

model.Axes.Add(new LatitudeWebMercatorAxis
{
	Position = AxisPosition.Left,
	Minimum = 51.42,
	Maximum = 51.62,
	Title = "Latitude",
	LabelFormatter = (decDegrees) => CartographyHelper.DecimalDegreesToDegreesMinutesSeconds(decDegrees, true, 3)
});
Decimal Degrees (DD) Coordinates System

e.g. 38.8897°, -77.0089° or 38.8897,-77.0089

LinearAxis

When using the basic Oxyplot LinearAxis, the map tiles are not rendered as true squares. example-openstreetmap-linear-axis

Data

LocalTileMapImageProvider

Usage

var tileMapImageProvider = new LocalTileMapImageProvider(pathToFolder);

HttpTileMapImageProvider

Usage

var tileMapImageProvider = new HttpTileMapImageProvider(SynchronizationContext.Current)
{
	Url = "https://server.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/tile/{Z}/{Y}/{X}",
	MaxNumberOfDownloads = 2,
	UserAgent = "OxyPlot.Cartography"
};

Unsuported image format by OxyPlot (mainly Jpeg)

Usage (Avalonia)

var tileMapImageProvider = new HttpTileMapImageProvider(SynchronizationContext.Current)
{
	Url = "https://server.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/tile/{Z}/{Y}/{X}",
	MaxNumberOfDownloads = 2,
	UserAgent = "OxyPlot.Cartography",
	ImageConverter = new Func<byte[], byte[]>(bytes =>
	{
		if (bytes.Length >= 2 && bytes[0] == 0x42 && bytes[1] == 0x4D)
		{
			return bytes; // Bmp
		}

		if (bytes.Length >= 4 && bytes[0] == 0x89 && bytes[1] == 0x50 && bytes[2] == 0x4E && bytes[3] == 0x47)
		{
			return bytes; //Png
		}

		using (var msInput = new MemoryStream(bytes))
		using (var msOutput = new MemoryStream())
		{
			var bitmap = Bitmap.DecodeToWidth(msInput, 256);
			bitmap.Save(msOutput);
			return msOutput.ToArray();
		}
		return bytes;
	})
};

Tile Images APIs

References

oxyplot-cartography's People

Contributors

bobld avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.