如何使用 json API 在 google 地图中添加标记?

How to add marker in the google map using json API in flutter?

我正在尝试使用 http 请求根据 json API (EventData) 向我的地图添加标记。当我 运行 我的代码时,地图不显示标记。我想我没有正确访问列表。我只想使用这些参数:来自 EventDataGPSPoint_latGPSPoint_lonAddress 。有人可以帮助我吗?

这是我的 json :

    {
   "Account": "",
   "Account_desc": "",
   "TimeZone": "GMT+00:00",
   "DeviceList": [
      {
         "Device": "v19",
         "Device_desc": "541266 DACIA NOIR",
         "VehicleID": "",
         "State": "62467",
         "LastNotifyText": "",
         "LastTimestamp": "1618683994",
         "LastGPSTimestamp": 1618700203,
         "Icon": "",
         "DeviceCode": "tk12x",
         "lastEngineHours": 4.5025,
         "FuelLevel": 0.0,
         "FuelTotal": "0.0 %",
         "simPhoneNumber": "0607250761",
         "EventData": [
            {
               "Device": "v19",
               "Timestamp": 1618700203,
               "Timestamp_date": "2021/04/17",
               "Timestamp_time": "22:56:43",
               "StatusCode": 62467,
               "StatusCode_hex": "0xF403",
               "StatusCode_desc": "Moteur OFF",
               "GPSPoint": "35.74512,-5.85550",
               "GPSPoint_lat": 35.74512,
               "GPSPoint_lon": -5.85550,
               "Speed_kph": 0.0,
               "Speed": 0.0,
               "Speed_units": "Km/H",
               "Heading": 0.0,
               "Heading_desc": "N",
               "Altitude_meters": 0.0,
               "Altitude": 0,
               "Altitude_units": "meters",
               "Odometer_km": 22438.364,
               "Odometer": 22438.364,
               "Odometer_units": "Distance en Kilomètre",
               "Geozone": "",
               "Geozone_index": 0,
               "Address": "Tanger, 90045, Maroc",
               "City": "Tanger",
               "PostalCode": "90045",
               "DigitalInputMask": 62467,
               "DriverID": "",
               "EngineHours": 4.50,
               "acceleration": 0.00,
               "brakeGForce": 0.00,
               "EngineCoolantTemperature_C": 0.0,
               "EngineCoolantTemperature": 32.0,
               "EngineCoolantTemperature_units": "F",
               "ThermoAverage_C": 0.0,
               "ThermoAverage": 32.0,
               "ThermoAverage_units": "F",
               "EngineFuelUsed_Liter": 0.0,
               "EngineFuelUsed": 0.0,
               "EngineFuelUsed_units": "Litre",
               "Index": 0
            }
]
      }
],
      "consomFuelL": 0.0,
      "consomFuelPr": "0.0 %",
      "debug": "",
      "maxspeed": 0.0,
      "KM": 22129.80960258997,
      "KMtotal": 22129.80960258997,
      "minStop": 0,
      "minOn": 0,
      "minMarche": 0,
      "Costfuel": 0.0
}

我的代码:

import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:http/http.dart' as http;
void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Maps (title: 'Flutter Demo Home Page'),
    );
  }
}

class Maps extends StatefulWidget {
  @override
  _MapsPageState createState() => _MapsPageState();
}

class _MapsPageState extends State<Maps> {
  String data;
  var superheros_length;
  String ValRet;
 int index;


  @override
  void initState() {
    // TODO: implement initState
    super.initState();
   // setCustomMarker();
    getData();
  }



  Set<Marker> _markers = {};
//worked
  void _onMapCreated(GoogleMapController controller) async{
    final googleOffices = await getData();
    setState(() {
      for (final dnn in googleOffices.jsonDecode(data)['DeviceList']) {
      _markers.clear();
      _markers.add(
          Marker(markerId: MarkerId(dnn.jsonDecode(data)['DeviceList']['Device']),
              position: LatLng(35.77561, -5.80351),
              // icon: mapMarker,
              infoWindow: InfoWindow(
                  title: dnn.jsonDecode(data)['DeviceList']['Device'],
                  snippet: dnn.jsonDecode(data)['DeviceList'][index]['address']
              )
          )
      );
    }
    });
  }


  getData() async {
    const googleLocationsURL = 'myAPIPrivate';

    // Retrieve the locations of Google offices
    final response = await http.get(googleLocationsURL);
    if (response.statusCode == 200) {
      data =response.body;
      superheros_length= jsonDecode(data)['DeviceList'];
      print (superheros_length.length);
    } else {
      throw HttpException(
          'Unexpected status code ${response.statusCode}:'
              ' ${response.reasonPhrase}',
          uri: Uri.parse(googleLocationsURL));
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
          appBar: AppBar(
            title: Text('Maps Sample App'),
            leading: IconButton(
              icon: Icon(Icons.arrow_back, color: Colors.white),
              onPressed: () => Navigator.of(context).pop(),
            ),
            // backgroundColor: Colors.green[700],
          ),
          body:
              GoogleMap(

                // mapType: _currentMapType,
                onMapCreated: _onMapCreated,
                markers: _markers,
                initialCameraPosition: CameraPosition(
                 target: const  LatLng(35.77561,-5.80351),
                 // target: _center,
                 // target: const  LatLng(0,0),
                  zoom: 11.0,
                ),
                // markers: _markers.values.toSet(),
              ),


          ),

    );

}

}  

错误:

代码中有几处可能需要更改。

  • var superheros_length; 是误导,我一开始以为它是一个整数,但根据你的 getData() 函数,它是一个映射。因此,首先将其更改为:
List<Map<String, dynamic>> super_heros_length;
  • 我会将 onMapCreated 函数改成这样:
void _onMapCreated(GoogleMapController controller) async{
    await getData();
    _markers.clear();
    
      for (final dnn in super_heros_length) {
    
    setState(() {
      
      _markers.add(
          Marker(markerId: MarkerId(dnn['Device']),
              position: LatLng(dnn["EventData"][0]["GPSPoint_lat"], dnn["EventData"][0]["GPSPoint_lon"]),
              // icon: mapMarker,
              infoWindow: InfoWindow(
                  title: dnn['Device'],
                  snippet: dnn["EventData"][0]['address']
              )
          )
      );    
    });
    }
  }

要访问 lat,基于您的 json,您必须像这样使用它:

["DeviceList"][0]["EventData"][0]["GPSPoint_lat"]

但由于您已经在访问 ["DeviceList"] 并将其分配给 superheroes_length,您不必重复自己,并使用此处的代码 post,并更新发生什么了。另外 post 您收到了什么错误。每次在 for 循环中迭代时,您还清除了标记,这样,如果您有多个标记,则只会显示最后一个标记,因为每次添加新标记时,您都会清除它之前的所有内容,这这就是为什么我把它放在循环之外的原因。