Я конвертирую приложение iOs в c # для создания многоплатформенной версии с xamarin.forms. Приложение представляет карту, на которой много полилиний, созданных из разных точек (широта и долгота). Когда полилиния «заканчивает» другую, начните плавно, даже если последняя точка полилинии является первой из следующей. Когда я использую одни и те же jsons для создания полилиний в c #, они перестают существовать, создавая нежелательный эффект. Как я могу попытаться решить эту проблему? Я получил нативную версию приложения для Android, и она имеет ту же проблему, что и мультиплатформенная версия. Я не автор кода iOs. Спасибо за помощь!
Это код объективного кода:
id resp =[NSJSONSerialization JSONObjectWithData:tratta.polilinea options:NSJSONReadingMutableContainers error:nil];
//NSLog(@"%@",resp);
if([resp isKindOfClass:[NSArray class]])
{
NSArray *listatratte = (NSArray*)resp;
CLLocationCoordinate2D* coords = malloc([listatratte count] * sizeof(CLLocationCoordinate2D));
float diskkm = tratta.ini_km;
for(int i = 0; i < [listatratte count]; i++)
{
id cordinate = [listatratte objectAtIndex:i];
//Aggiungo offset
float lineangle = atan2(tratta.ini_lat - tratta.end_lat, tratta.end_lon - tratta.ini_lon);
//float halfGap = 0.0060;
float halfGap = [self getOffsetStrade];
float radians = 90/M_PI;
float angleTop = 90/radians + lineangle;
float topoffsetx = cos(angleTop)*halfGap;
float topoffsety = sin(angleTop)*halfGap;
float angleBottom = -90/radians + lineangle;
float botoffsetx = cos(angleBottom)*halfGap;
float botoffsety = sin(angleBottom)*halfGap;
if([tratta.direzione isEqualToString:@"D"])
{
CLLocationCoordinate2D punto = CLLocationCoordinate2DMake([[cordinate objectForKey:@"lat"]doubleValue]+topoffsetx, [[cordinate objectForKey:@"lon"]doubleValue]+topoffsety);
coords[i] = punto;
}
else
{
CLLocationCoordinate2D punto = CLLocationCoordinate2DMake([[cordinate objectForKey:@"lat"]doubleValue]+botoffsetx, [[cordinate objectForKey:@"lon"]doubleValue]+botoffsety);
coords[i] = punto;
}
}
MKPolyline *poly = [MKPolyline polylineWithCoordinates:coords count:[listatratte count]];
if([tratta.direzione isEqualToString:@"D"])
{
poly.title = @"D";
}
else
{
poly.title = @"S";
}
free(coords);
это код c #:
private async Task DrawPolyline(List<Tuple<int,List<Model.Position>>> ListOfListPolylinePoints)
{
//IsIntoFiPiLi = false;
if (Map.Polylines.Count > 0) RemovePolylines();
foreach (var listOfPoints in ListOfListPolylinePoints)
{
var tratta = await RepositoryHelper.Instance.TratteRepository.GetItemAsync(listOfPoints.Item1);
var polyline_to_draw = new Polyline();
var points_polilyne = listOfPoints.Item2;
for (var i = 0; i < points_polilyne.Count - 1; i++)
{
var lineAngle = Math.Atan2(points_polilyne[i].lat - points_polilyne[i + 1].lat,
points_polilyne[i + 1].lon - points_polilyne[i].lon);
var halfGap = GetOffsetStreet();
var radians = 90 / Math.PI;
var angleTop = 90 / radians + lineAngle;
var topoffsetx = Math.Cos(angleTop) * halfGap;
var topoffsety = Math.Sin(angleTop) * halfGap;
var angleBottom = -90 / radians + lineAngle;
var botoffsetx = Math.Cos(angleBottom) * halfGap;
var botoffsety = Math.Sin(angleBottom) * halfGap;
if (tratta.direzione == "D")
polyline_to_draw.Positions.Add(new Position(points_polilyne[i].lat + topoffsetx,
points_polilyne[i].lon + topoffsety));
else
polyline_to_draw.Positions.Add(new Position(points_polilyne[i].lat + botoffsetx,
points_polilyne[i].lon + botoffsety));
}
polyline_to_draw.StrokeColor = GetTrafficColor(tratta);
polyline_to_draw.StrokeWidth = strokeWidth;
Map.Polylines.Add(polyline_to_draw);
}
}