Каковы различия для полилиний между картами iOs и картами Android? - PullRequest
0 голосов
/ 23 октября 2019

Я конвертирую приложение iOs в c # для создания многоплатформенной версии с xamarin.forms. Приложение представляет карту, на которой много полилиний, созданных из разных точек (широта и долгота). Когда полилиния «заканчивает» другую, начните плавно, даже если последняя точка полилинии является первой из следующей. Когда я использую одни и те же jsons для создания полилиний в c #, они перестают существовать, создавая нежелательный эффект. Как я могу попытаться решить эту проблему? Я получил нативную версию приложения для Android, и она имеет ту же проблему, что и мультиплатформенная версия. Я не автор кода iOs. Спасибо за помощь!

ios version

xamarin.forms version

Это код объективного кода:

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);
            }
        }

1 Ответ

1 голос
/ 25 октября 2019

Так, как я могу избежать того, что Newtonsoft.Json округляет значения, взятые из json?

Вы можете установить FloatParseHandling в Decimal в JsonSerializerSettings, вотПример кода:

var settings = new JsonSerializerSettings(); 
settings.FloatParseHandling = FloatParseHandling.Decimal;
var data = JsonConvert.DeserializeObject(json, settings);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...