вторник, 26 июля 2011 г.

небольшой пример использования open street map в С#

попытался загружать тайлы из open street map (wiki.openstreetmap.org/wiki/Slippy_map_tilenames),сделал небольшой тестовый пример



public partial class Form1 : Form
    {
        string[] mas;     
        public Form1()
        {
            InitializeComponent(); 
        }
//загружаем тайл в папку и отображаем на картинке
        private void button1_Click(object sender, EventArgs e)
        {
            WebClient WC = new WebClient();
            string DownloadFile = Path.GetFileName(textBox1.Text);
            mas = textBox1.Text.Split('/');
            try
            {
                WC.DownloadFile(textBox1.Text, Application.StartupPath + "\\" + DownloadFile);
                pictureBox1.ImageLocation = Application.StartupPath + "\\" + DownloadFile;
            }
            catch { textBox1.Text = "cant do it"; }
        }
//это стандартная функция с сайта по ссылке выше
        public PointF WorldToTilePos(double lon, double lat, int zoom)
        {
            PointF p = new Point();
            p.X = (float)((lon + 180.0) / 360.0 * (1 << zoom));
            p.Y = (float)((1.0 - Math.Log(Math.Tan(lat * Math.PI / 180.0) +
            1.0 / Math.Cos(lat * Math.PI / 180.0)) / Math.PI) / 2.0 * (1 << zoom));

            return p;
        }
//это  тоже стандартная функция с сайта по ссылке выше
        public PointF TileToWorldPos(double tile_x, double tile_y, int zoom)
        {
            PointF p = new Point();
            double n = Math.PI - ((2.0 * Math.PI * tile_y) / Math.Pow(2.0, zoom));

            p.X = (float)((tile_x / Math.Pow(2.0, zoom) * 360.0) - 180.0);
            p.Y = (float)(180.0 / Math.PI * Math.Atan(Math.Sinh(n)));

            return p;
        }
//формируем строку адреса тайла
        private void button2_Click(object sender, EventArgs e)
        {
            PointF MyPos = WorldToTilePos(double.Parse(lon.Text), double.Parse(lat.Text), int.Parse(zoom.Text));
            int x = (int)MyPos.X;
            int y = (int)MyPos.Y;
            textBox1.Text = "http://tile.openstreetmap.org/" + zoom.Text + "/" + x + "/" + y + ".png";

        }     
    }
все вроде просто,написал чтобы проще было искать

2 комментария:

  1. Этот комментарий был удален автором.

    ОтветитьУдалить

  2. Aily20 сентября 2016 г., 2:22
    Что-то мне этот TileToWorldPos этот возвращает черте что :)
    Канвертировал с питона, все заработало
    public static void TileToWorldPos(double tile_x, double tile_y, int zoom, out double x, out double y)
    {
    var n = System.Math.Pow(2, zoom);
    var lon_deg = tile_x / n * 360.0 - 180.0;
    var lat_rad = System.Math.Atan(System.Math.Sinh(System.Math.PI * (1 - 2 * tile_y / n)));
    var lat_deg = lat_rad * 180.0 / System.Math.PI;
    x = lat_deg;
    y = lon_deg;
    }

    ОтветитьУдалить

Краткая шпаргалка по EtherChannel:

Протокол агрегации портов ( P ort Ag gregation P rotocol (PAgP)) и протокол управления агрегацией каналов ( L ink A ggregation C ontrol P ...