Как добавить маркеры на карту из rest-api?

1

Я использую компонент Google Maps внутри моего проекта Xamarin.iOS. Я хватаю json от моего запроса, анализируя его, пытается добавить каждый массив в ответ как маркер на mapView. Когда я создаю свое приложение, я не получаю сообщение об ошибке, приложение работает так, как должно. Но на моей карте нет маркеров.

MapController.cs

using System;
using System.Drawing;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
using System.Net;
using System.Json;
using System.IO;
using Google.Maps;
using MonoTouch.CoreLocation;

namespace News
{
        public partial class MapController : UIViewController
        {

                MapView mapView;

                public MapController () : base ("MapController", null)
                {
                        Title = "Karta";
                }

                public override void ViewDidLoad ()
                {
                        base.ViewDidLoad ();
                        this.NavigationController.NavigationBar.TintColor = UIColor.White;
                        this.NavigationController.NavigationBar.SetTitleTextAttributes (new UITextAttributes { TextColor = UIColor.White });
                        this.NavigationController.NavigationBar.BarTintColor = UIColor.Orange;

                        var camera = CameraPosition.FromCamera (
                                latitude: 0.0,
                                longitude: 0.0,
                                zoom: 6
                        );

                        mapView = MapView.FromCamera (RectangleF.Empty, camera);

                        try {
                                var request = WebRequest.Create("http://www.example.com");
                                var response = request.GetResponse ();
                                using(var stream = new StreamReader(response.GetResponseStream())){
                                        var json = stream.ReadToEnd ();
                                        var jsonVal = JsonValue.Parse (json);                          
                                        for(var i=0; i<jsonVal["result"].Count; i++){
                                                //CLLocationCoordinate2D coord = new CLLocationCoordinate2D();
                                                InvokeOnMainThread ( () => {
                                                        // manipulate UI controls
                                                        var marker = new Marker () {
                                                                Title = jsonVal["result"][i]["title"],
                                                                Snippet = jsonVal["result"][i]["address"],
                                                                Position = new CLLocationCoordinate2D (jsonVal["result"][i]["lat"],jsonVal["result"][i]["lon"])
                                                        };
                                                        marker.Map = mapView;
                                                });
                                        }
                                };
                                response.Close ();
                        }
                        catch
                        {
                                //
                        }
                        mapView.StartRendering ();
                        View = mapView;
                }

                public override void ViewWillAppear (bool animated)
                {
                        base.ViewWillAppear (animated);
                }

                public override void ViewWillDisappear (bool animated)
                {      
                        mapView.StopRendering ();
                        base.ViewWillDisappear (animated);
                }
        }
}

Почему это так?

  • 0
    У вас есть пример ответа? Я создал простое приложение, использующее в основном все, что вы делали, и смог многократно добавлять булавки на мою карту.
  • 0
    @TimSneed Вот суть gist.github.com/jackbillstrom/75be6339efc1e54f1ce2
Показать ещё 6 комментариев
Теги:
xamarin
google-maps
xamarin.ios
google-maps-sdk-ios

2 ответа

1
Лучший ответ

При запуске вашего примера у вас был блокирующий вызов.

В вашем \Controller\Maps\MapControler.cs

изменение:-

public override void LoadView()

чтобы: -

public async override void LoadView()

а также изменение: -

Task.Run(async() => await StageTheView());

чтобы: -

await StageTheView();

Затем он будет запускаться и отображать маркеры.

Дайте мне знать, если вы хотите, чтобы я отправил обратно решение, если вы все еще испытываете трудности?

  • 0
    В качестве комментария я почти уверен, что считать асинхронную пустоту вне обработчика событий верхнего уровня считается плохой практикой.
  • 0
    Это было исправлением вашего кода, который @Jack отправил мне, чтобы он заработал, поскольку он не работал для него. Я не писал это с нуля.
1

Из вашего комментария с api я смог загрузить данные; попробуйте что-то вроде этого.

public override void LoadView ()
    {
        base.LoadView ();

        CameraPosition camera = CameraPosition.FromCamera (62.3909145, 17.3098496, 15);

        mapView = MapView.FromCamera (RectangleF.Empty, camera);
        mapView.MyLocationEnabled = true;

        Task.Run(async () => await StageTheView());

        View = mapView;
    }

    private async Task StageTheView()
    {
        using (var client = new HttpClient())
        {
            var result = await client.GetAsync("http://www.unikabutiker.nu/api/?function=searchByName&key=kT6zAOpNk21f9UhhNWzVrK8fHjvl22K2imF1aRkvN9aScUOK6v&name=Sundsvall");
            var s = "";
            using (var reader = new StreamReader(await result.Content.ReadAsStreamAsync()))
            {
                s = await reader.ReadToEndAsync();
            }

            var jsonVal = JsonValue.Parse(s);                          
            for (var i = 0; i < jsonVal["result"].Count; i++)
            {
                // manipulate UI controls
                var marker = new Marker()
                {
                    Title = jsonVal["result"][i]["title"],
                    Snippet = jsonVal["result"][i]["adress"],
                    Position = new CLLocationCoordinate2D(jsonVal["result"][i]["lat"], jsonVal["result"][i]["lng"])
                };
                marker.Map = mapView;
            }
        }
    }

Вам нужно будет добавить ссылку на System.Threading.Tasks и System.Net.Http

  • 0
    Пробовал, но на моей карте не было никаких маркеров
  • 0
    Положите свой XIB в суть. Там должно быть что-то происходит.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню