Я пытаюсь внедрить маркеры карт 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);
}
Если вы поместите вызов журнала в 'ReadPointsFromDb()', он вызван? Просто убедитесь, что метод правильно вызван из вашего события нажатия кнопки. – Koh
Да @Koh. Я пишу на консоль из ReadPointsFromDb, и я могу сказать, когда мы находимся внутри метода. – naffie
Сколько маркеров вы ожидаете? Этот фрагмент кода будет печатать только один маркер. Сначала убедитесь, что ваш 'foreach' перебирает действительный список. Если в 'dataManager.GetAllReceiverPoints()' есть элементы, вызывается 'map.AddMarker()' для каждого из них. – Koh