2015-03-05 3 views
0

Я пытаюсь внедрить маркеры карт Google с использованием C#. У меня есть значения lat/long, сохраненные в моем SQLite db, которые затем читаю и хочу отображать на карте . В панели действий «Точки загрузки» есть опция «Обратные точки», которая должна вызывать метод «ReadPointsFromDb()», где я создаю новый маркер. Я попробовал несколько примеров без разницы, хотя рисование маркеров на карте довольно стандартно и я думаю, что я сделал это правильно, за исключением того, что нет эффекта, когда я нажимаю на Load points. Никаких изменений. Никакие маркеры не отображаются на карте каждый раз.Xamarin.Android -координаты от SQLite не нарисованы на Google maps

Это то, что метод выглядит следующим образом:

//retrieve a list of all the contents of receiverpoint table items 
    public void ReadPointsFromDb() 
    { 


     double lat = 0; 
     double lon = 0; 

     int count = dataManager.GetAllReceiverPoints().Count; 

     foreach(ReceiverPointTable item in dataManager.GetAllReceiverPoints()) 
     { 
      lat = item.LATITUDE; 

      lon = item.LONGITUDE; 
     } 

     if(map != null){ 



      RunOnUiThread (new Action (delegate { 

       map.Clear(); 

       receiver_point = new LatLng (lat, lon); 

       var markerOpt1 = new MarkerOptions(); 
       markerOpt1.SetTitle("Test point"); 
       markerOpt1.SetPosition (receiver_point); 
       markerOpt1.InvokeIcon(BitmapDescriptorFactory.DefaultMarker(BitmapDescriptorFactory.HueMagenta)); 
       map.AddMarker(markerOpt1); 
      })); 

     } 

    } 

EDIT 1 Я изменил метод выше, чтобы сделать маркеры внутри цикла Еогеаспа, но я до сих пор не получаю никакого changes.Only маркера для текущая позиция рисуется

public void ReadPointsFromDb() 
    { 
     double lat = 0; 
     double lon = 0; 

     List<LatLng> newPoints = new List<LatLng>(); 

     int count = dataManager.GetAllReceiverPoints().Count; 


     IList<ReceiverPointTable> allPoints = dataManager.GetAllReceiverPoints(); 

     System.Console.WriteLine ("size of All points : " + count); 
try 
     { 
      if(allPoints.Count > 0) 
       { 
        foreach(ReceiverPointTable item in allPoints) 
         { 
          lat = item.LATITUDE; 

          lon = item.LONGITUDE; 

          receiver_point = new LatLng(lat,lon); 


          RunOnUiThread (new Action (delegate { 

          map.Clear(); 

          var markerOpt1 = new MarkerOptions(); 
          markerOpt1.SetTitle("Your current location"); 
          markerOpt1.SetPosition (map_center); 
          markerOpt1.InvokeIcon(BitmapDescriptorFactory.DefaultMarker(BitmapDescriptorFactory.HueMagenta)); 
          map.AddMarker(markerOpt1); 



          var markerOpt2 = new MarkerOptions(); 
          markerOpt2.SetTitle("Test point"); 
          markerOpt2.SetPosition (receiver_point); 
          markerOpt2.InvokeIcon(BitmapDescriptorFactory.DefaultMarker(BitmapDescriptorFactory.HueRed)); 
          map.AddMarker(markerOpt2); 



        })); 



         } 
       } 

     }catch(Exception e) 
      { 

      logger.Error (this, e); 
      } 
} 

EDIT 2 Это, как я модифицировал метод еще раз, чтобы иметь надлежащее себе ствие событий: общественных недействительный ReadPointsFromDb() {

try 
     { 

       if(map != null) 
       { 

        //RunOnUiThread (new Action (delegate { 

        //map.Clear(); 

        //})); 
foreach(ReceiverPointTable item in dataManager.GetAllReceiverPoints()) 
         { 
          var markerOpt2 = new MarkerOptions(); 
          markerOpt2.SetTitle("Test point"); 
          markerOpt2.SetPosition (new LatLng(item.LATITUDE,item.LONGITUDE)); 
          markerOpt2.InvokeIcon(BitmapDescriptorFactory.DefaultMarker(BitmapDescriptorFactory.HueRed)); 

          RunOnUiThread (new Action (delegate { 

          map.AddMarker(markerOpt2); 

          })); 

         } 

      } 
     }catch(Exception e) 
      { 

      logger.Error (this, e); 
      } 
+0

Если вы поместите вызов журнала в 'ReadPointsFromDb()', он вызван? Просто убедитесь, что метод правильно вызван из вашего события нажатия кнопки. – Koh

+0

Да @Koh. Я пишу на консоль из ReadPointsFromDb, и я могу сказать, когда мы находимся внутри метода. – naffie

+0

Сколько маркеров вы ожидаете? Этот фрагмент кода будет печатать только один маркер. Сначала убедитесь, что ваш 'foreach' перебирает действительный список. Если в 'dataManager.GetAllReceiverPoints()' есть элементы, вызывается 'map.AddMarker()' для каждого из них. – Koh

ответ

1

Если вы пытаетесь показать несколько точек на карте от ReceiverPointTable, я думаю, что проблема находится в пределах вашей логики управления/потока и порядка вы делая вещи и функцию четкой карты. Ваша логика, похоже, перебирает все данные в вашем db, но только находит последний элемент ReceiverPointTable и помещает его на карту.

Я думаю, что лучше коды могут быть

if(map != null) 
{ 
    RunOnUiThread (new Action (delegate { map.Clear(); }); 

    foreach(ReceiverPointTable item in dataManager.GetAllReceiverPoints()) 
    { 
     var markerOpt1 = new MarkerOptions(); 
     markerOpt1.SetTitle("Test point"); 
     markerOpt1.SetPosition (new LatLng (item.LATITUDE, item.LONGITUDE)); 
     markerOpt1.InvokeIcon(BitmapDescriptorFactory.DefaultMarker(
             BitmapDescriptorFactory.HueMagenta)); 
     RunOnUiThread (new Action (delegate { map.AddMarker(markerOpt1); })); 
    } 
} 

Edit, так это минимальный жизнеспособный код, который я создал, что перебирает коллекцию и рисует на карте.

Main.xaml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <fragment 
      class="com.google.android.gms.maps.MapFragment" 
      android:id="@+id/map" 
      android:layout_width="match_parent" 
      android:layout_weight="3" 
      android:layout_height="0dp" /> 
    <Button 
     android:id="@+id/myButton" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Load points" /> 
</LinearLayout> 

Main.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using Android.App; 
using Android.Content; 
using Android.Runtime; 
using Android.Views; 
using Android.Widget; 
using Android.OS; 
using Android.Gms.Maps; 
using Android.Gms.Maps.Model; 

namespace MapTest 
{ 
    [Activity (Label = "MapTest", MainLauncher = true, Icon = "@drawable/icon")] 
    public class MainActivity : Activity 
    { 
     GoogleMap map; 

     protected override void OnCreate (Bundle bundle) 
     { 
      base.OnCreate (bundle); 
      SetContentView (Resource.Layout.Main); 
      MapFragment mapFrag = FragmentManager.FindFragmentById<MapFragment>(Resource.Id.map); 
      map = mapFrag.Map; 
      Button button = FindViewById<Button> (Resource.Id.myButton); 
      button.Click += delegate { 
       LoadPoints(); 
      }; 
     } 

     void LoadPoints() 
     { 
      var points = new List<Tuple<string, double, double>>() { 
       Tuple.Create("London", 51.50000, -0.11670), 
       Tuple.Create("New York", 40.75170, -73.99420), 
       Tuple.Create("Hong Kong", 21.75000, 115.00000), 
       Tuple.Create("Berlin", 52.51670, 13.33330), 
       Tuple.Create("Buenos Aires", -34.33320, -58.49990), 
       Tuple.Create("Cairo, Egypt", 30.00000, 31.28330), 
       Tuple.Create("Geneva", 46.23330, 6.06670), 
       Tuple.Create("Singapore", 1.36670, 103.75000), 
       Tuple.Create("Washington", 38.89750, -77.00920), 
       Tuple.Create("Canberra", -35.35000, 149.16670) 
      }; 

      var fiveRandomPointsFromList = points.OrderBy(x => Guid.NewGuid()).Take(5); 

      if (map != null) 
      { 
       RunOnUiThread (new Action (delegate { map.Clear(); })); 

       foreach(var point in fiveRandomPointsFromList) 
       { 
        var markerOpt1 = new MarkerOptions() 
         .SetTitle(point.Item1) 
         .SetPosition(new LatLng(point.Item2, point.Item3)) 
         .InvokeIcon(BitmapDescriptorFactory.DefaultMarker(
         BitmapDescriptorFactory.HueMagenta)); 
        RunOnUiThread (new Action (delegate { map.AddMarker(markerOpt1); })); 
       } 
      } 
     } 
    } 
} 

Если это не сработает, то вы знаете, что есть что-то не так с вашей сборки. Если это сработает и ваш предыдущий код сработает, вам нужно отлаживать, какие значения вы возвращаете из вызовов из dataManager.GetAllReceiverPoints(), и являются ли это допустимыми значениями для Lat Long points.

+0

. Я изменил свой код так, как вы сказали выше, но я до сих пор не получаю никаких маркеров. Я честно не знаю, что это такое. Я тоже проверяю размер списка, чтобы убедиться, что он имеет данные. – naffie

+0

У вас есть где-нибудь с этим или есть вы все еще боретесь? – AlexC

+0

Позвольте мне попытаться выполнить ваш пример и посмотреть, работает ли он – naffie

Смежные вопросы