首页 > 解决方案 > 如何使用 xamarin.forms.maps iOS C# 循环 API 页面并比较地图上更改标记的值

问题描述

我想检查 API 中的每个页面值,并根据这些值更改地图标记的颜色。

这是我的 API: http: //194.141.118.43 :3001/? id=0 其中 id 是从 0 到 16

我想:

如果从 ?id=0 AL = 1 开始,标记应该是绿色的

如果从 ?id=0 AL = 2 开始,标记应该是黄色的

如果从 ?id=0 AL = 3 开始,标记应该是橙色的

如果从 ?id=0 AL = 4 开始,标记应该是红色的

所以我想检查所有 17 个站点(从 ?id=0 到 ?id=16)

我目前正在Alertlevelwebsite使用此 API 检查此方法中的属性:http://194.141.118.43:3001/stations,但现在我必须检查此地址中每个引脚的所有值,并且我必须为最大的每个引脚的值。

http://194.141.118.43:3001/?id=0(从 0 到 16)

我使用xamarin.forms.maps中的这个例子- https://docs.microsoft.com/en-us/samples/xamarin/xamarin-forms-samples/workingwithmaps/CustomMapRenderer课堂上我尝试在这个方法中改变颜色:

protected override MKAnnotationView GetViewForAnnotation(MKMapView mapView, IMKAnnotation annotation)
    {
        MKAnnotationView annotationView = null;

        if (annotation is MKUserLocation)
            return null;

        var customPin = GetCustomPin(annotation as MKPointAnnotation);

        //Get Value
        c_annotation = annotation;

        if (customPin == null)
        {
            throw new Exception("Custom pin not found");
        }

        annotationView = mapView.DequeueReusableAnnotation(customPin.Name);
        if (annotationView == null)
        {
            annotationView = new CustomMKAnnotationView(annotation, customPin.Name);
            annotationView.CalloutOffset = new CGPoint(0, 0);
            ((CustomMKAnnotationView)annotationView).Name = customPin.Name;
            ((CustomMKAnnotationView)annotationView).Url = customPin.Url;
            ((CustomMKAnnotationView)annotationView).Address = customPin.Address;
            //Add First Line
            ((CustomMKAnnotationView)annotationView).AlertLevel = customPin.AlertLevel;

            if (customPin.AlertLevel == 1)
            {
                annotationView.Image = UIImage.FromFile("green.png");
            }
            else if (customPin.AlertLevel == 2)
            {
                annotationView.Image = UIImage.FromFile("yellow.png");
            }
            else if (customPin.AlertLevel == 3)
            {
                annotationView.Image = UIImage.FromFile("orange.png");
            }
            else if (customPin.AlertLevel == 4)
            {
                annotationView.Image = UIImage.FromFile("red.png");
            }

            //Add Second Line
            ((CustomMKAnnotationView)annotationView).CodeNum = customPin.CodeNum;

            ((CustomMKAnnotationView)annotationView).MapCode = customPin.MapCode;


            //Here I add the RequestUri for stations
            string GenerateRequestUriStations(string endpoint)
            {
                string requestUri = endpoint;
                requestUri += $"stations";

                return requestUri;
            }

            //Here I need the loop from 0 to 16 every page and change the pin icons like above if statement
            string GenerateRequestUri(string endpoint)
            {
                string requestUri = endpoint;
                requestUri += $"?id=0";

                return requestUri;
            }

            //This is the value who I need to compare result.WaterData.Ardaforecast but does not allow me to write result.WaterData.Ardaforecast and does not allow me to foreach here .. I don't know why ?
            var reusult = _restServiceData.GetWaterDataForecast(GenerateRequestUriStations(Constants.EndPoint), GenerateRequestUri(Constants.EndPoint));

        }


        annotationView.CanShowCallout = true;

        configureDetailView(annotationView);

        return annotationView;
    }

在代码上面的评论中,我的意思是当我写的时候:

 var reusult = _restServiceData.GetWaterDataForecast(GenerateRequestUriStations(Constants.EndPoint), GenerateRequestUri(Constants.EndPoint));

            foreach (var item in IAsyncResult)
            {

            }

当我尝试写result.自动让我IAsyncResult..我不知道为什么..?

我可以获得一个如何循环所有页面并更改标记颜色的示例吗?

我的 GetDataFromAPI 如下所示:

public IEnumerable<AlertLevel> GetDataFromAPI(int mapCode)
    {
        var listAlert = new List<AlertLevel>();

        var reusult = _restServiceData.GetWaterDataForecast(GenerateRequestUriStations(Constants.EndPoint), GenerateRequestUri(Constants.EndPoint, mapCode));

        foreach (var item in reusult.WaterData.Ardaforecast[0].Items)
        {
            var currentData = new AlertLevel()
            {
                dateForecast = item.DateTimeForecast,
                levelForecast = item.AlertLevelForecast
                
            };


            listAlert.Add(currentData);
        }

        return listAlert;
    }

我的 GetWaterDataForecast 看起来像这样:

    using System;
using System.Diagnostics;
using System.Net.Http;
using System.Threading.Tasks;
using MaritsaTundzhaForecast.Models;
using Newtonsoft.Json;

namespace MaritsaTundzhaForecast.Services
{
    public class RestServiceData
    {
        HttpClient _client1;

        HttpClient _client2;

        public RestServiceData()
        {
            _client1 = new HttpClient();

            _client2 = new HttpClient();
        }

        public WaterBindingData GetWaterDataForecast(string query, string query2)
        {
            WaterDataJson waterData = new WaterDataJson();
            WaterStationsJson waterStations = new WaterStationsJson();

            WaterBindingData result = new WaterBindingData();
            try
            {

                var task = Task.Run(() => _client1.GetAsync(query));
                task.Wait();
                var response = task.Result;

                var task2 = Task.Run(() => _client2.GetAsync(query2));
                task2.Wait();
                var response2 = task2.Result;


                if (response.IsSuccessStatusCode && response2.IsSuccessStatusCode)
                {
                    var content = response.Content.ReadAsStringAsync().Result;
                    var content2 = response2.Content.ReadAsStringAsync().Result;

                    var json = content2.Replace("\"ardaforecast\":[[", "\"ardaforecast\":[ {\"items\": [")
                                                 .Replace("}],{\"fieldCount\"", "}],\"details\":{\"fieldCount\"")
                                                 .Replace("}]}", "}}]}");
                    waterData = JsonConvert.DeserializeObject<WaterDataJson>(json);


                    waterStations = JsonConvert.DeserializeObject<WaterStationsJson>(content);

                    result.WaterData = waterData;
                    result.WaterStation = waterStations;
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine("\t\tERROR {0}", ex.Message);
            }

            return result;
        }
    }

}

我的WaterBindingData样子:

    using System;
namespace MaritsaTundzhaForecast.Models
{
    public class WaterBindingData
    {
        public WaterDataJson WaterData { get; set; }

        public WaterStationsJson WaterStation { get; set; }
    }
}

我的WaterDataJsonWaterStations看起来像:

    using System;
using System.Collections.Generic;
using Newtonsoft.Json;

namespace MaritsaTundzhaForecast
{
    public class WaterDataJson
    {
        public List<ForecastBody> Ardaforecast { get; set; }
    }
    public class ForecastBody
    {
        public ForecastItem[] Items { get; set; }
        public ForecastDetails Details { get; set; }
    }

    public class ForecastItem
    {
        [JsonProperty("Dt")]
        public DateTime DateTimeForecast { get; set; }

        [JsonProperty("AL")]
        public int AlertLevelForecast { get; set; }
    }

    public class ForecastDetails
    {
        public int fieldCount { get; set; }
        public int affectedRows { get; set; }
        public int insertId { get; set; }
        public int serverStatus { get; set; }
        public int warningCount { get; set; }
        public int changedRows { get; set; }
        public string message { get; set; }
        public bool protocol41 { get; set; }
    }
}

    using System;
using System.Collections.Generic;
using Newtonsoft.Json;

namespace MaritsaTundzhaForecast.Models
{
    public class WaterStationsJson
    {
        public List<ForecastStations> Stations { get; set; }
    }
    public class ForecastStations
    {
        [JsonProperty("Map_code")]
        public int MapCode { get; set; }

        [JsonProperty("NAME_IME")]
        public string NameEN { get; set; }

        [JsonProperty("NAME_CYR")]
        public string NameBG { get; set; }

        [JsonProperty("Alertlevelwebsite")]
        public int AlertLevelStation { get; set; }

        [JsonProperty("CODENUM")]
        public int CodeNum { get; set; }
    }
}

标签: c#xamarinxamarin.formsmaps

解决方案


推荐阅读