Google 地图折线未出现
Google Maps Polyline not Appearing
我试图在我的 Flutter Dart Android 应用程序的 GoogleMaps 小部件中显示多条折线,但它们没有出现。小部件和地图显示完美,但折线不存在。
当我的代码运行时,折线已成功添加到 _polylines,并且 GoogleMaps 小部件包含“折线:_polylines”,它们仍然不会显示。
有什么想法吗?
我的代码如下所示:
class TotalStatsViewModel extends BaseViewModel {
final _navigationService = locator<NavigationService>();
Set<Polyline> _polylines = HashSet<Polyline>();
GoogleMapController mapController;
Widget getWidget() {
if (getLoggedInUser().activityList.length != 0) {
return Column(
children: [
getMap(),
Text(
'Total Distance Biked:',
textScaleFactor: 2,
),
Text(
getTotalDistance(),
textScaleFactor: 1.5,
),
Text(
'Total Duration Biked:',
textScaleFactor: 2,
),
Text(
getTotalDuration(),
textScaleFactor: 1.5,
),
Text(
'Average Biking Speed:',
textScaleFactor: 2,
),
Text(
getAverageSpeed(),
textScaleFactor: 1.5,
),
Spacer(),
Padding(
padding: const EdgeInsets.all(10.0),
child: ElevatedButton(
onPressed: () {
routeToHubView();
},
child: Text('Return'),
)),
Row(), //Row is here to center the column by adding a max width element.
],
);
} else {
return Column(
children: [
Text(
'User needs at least one added activity to display statistics.',
textScaleFactor: 1.5,
textAlign: TextAlign.center,
),
Spacer(),
Padding(
padding: const EdgeInsets.all(10.0),
child: ElevatedButton(
onPressed: () {
routeToHubView();
},
child: Text('Return'),
)),
Row(), //Row is here to center the column by adding a max width element.
],
);
}
}
Widget getMap() {
for (int i = 0; i < getLoggedInUser().activityList.length; i++) {
constructPolyline(getLoggedInUser().activityList[i]);
}
return SizedBox(
height: 300,
child: GoogleMap(
mapType: MapType.normal,
onMapCreated: _onMapCreated,
initialCameraPosition: CameraPosition(
//target: LatLng(45.521563, -122.677433),
target: LatLng(47.6645740, -122.0411640),
zoom: 11.0,
),
polylines: _polylines,
),
);
}
void constructPolyline(Activity activity) {
print('CONSTRUCT POLYLINE CALLED');
List<LatLng> polylineLatLongs = [];
//fix with activity
Gpx gpx = GpxReader().fromString('<?xml version="1.0" encoding="UTF-8"?>'
'<gpx creator="StravaGPX" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd" version="1.1" xmlns="http://www.topografix.com/GPX/1/1" xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">'
'<metadata>'
'<time>2022-02-06T21:22:54Z</time>'
'</metadata>'
'<trk>'
'<name>Afternoon Ride</name>'
'<type>1</type>'
'<trkseg>'
'<trkpt lat="47.6645740" lon="-122.0411640">'
'<ele>113.0</ele>'
'<time>2022-02-06T21:22:54Z</time>'
'<extensions>'
'<power>0</power>'
'<gpxtpx:TrackPointExtension>'
'<gpxtpx:atemp>22</gpxtpx:atemp>'
'<gpxtpx:hr>85</gpxtpx:hr>'
'<gpxtpx:cad>37</gpxtpx:cad>'
'</gpxtpx:TrackPointExtension>'
'</extensions>'
'</trkpt>'
'<trkpt lat="47.6645750" lon="-122.0411670">'
'<ele>128.0</ele>'
'<time>2022-02-06T21:22:55Z</time>'
'<extensions>'
'<power>0</power>'
'<gpxtpx:TrackPointExtension>'
'<gpxtpx:atemp>22</gpxtpx:atemp>'
'<gpxtpx:hr>87</gpxtpx:hr>'
'<gpxtpx:cad>37</gpxtpx:cad>'
'</gpxtpx:TrackPointExtension>'
'</extensions>'
'</trkpt>');
//debug code
print('trks: ' + gpx.trks.length.toString());
print('trksegs: ' + gpx.trks[0].trksegs.length.toString());
print('trkpts: ' + gpx.trks[0].trksegs[0].trkpts.length.toString());
for (int i = 0; i < gpx.trks.length; i++) {
for (int j = 0; j < gpx.trks[i].trksegs.length; j++) {
for (int k = 0; k < gpx.trks[i].trksegs[j].trkpts.length; k++) {
polylineLatLongs.add(LatLng(gpx.trks[i].trksegs[j].trkpts[k].lat,
gpx.trks[i].trksegs[j].trkpts[k].lon));
print('ITERATION DONE');
}
}
}
print(polylineLatLongs.toString());
//polylineLatLongs.add(LatLng(47.664574, -122.041164));
//polylineLatLongs.add(LatLng(47.664575, -122.041167));
_polylines.add(Polyline(
polylineId: PolylineId('0'),
points: polylineLatLongs,
color: Colors.red,
visible: true,
width: 10));
print(_polylines.toString());
}
void _onMapCreated(GoogleMapController controller) {
mapController = controller;
}
String getTotalDistance() {
User user = getLoggedInUser();
double distanceSum = 0;
for (int i = 0; i < user.activityList.length; i++) {
distanceSum += user.activityList[i].distance;
}
distanceSum = double.parse((distanceSum).toStringAsFixed(2));
return distanceSum.toString() + ' miles';
}
String getTotalDuration() {
User user = getLoggedInUser();
int totalSeconds = 0;
for (int i = 0; i < user.activityList.length; i++) {
totalSeconds += user.activityList[i].duration.inSeconds;
}
Duration totalDuration = Duration(seconds: totalSeconds);
List<String> splitDistance = totalDuration.toString().split('.');
return splitDistance[0];
}
String getAverageSpeed() {
User user = getLoggedInUser();
double avgSpeed = 0;
for (int i = 0; i < user.activityList.length; i++) {
avgSpeed += user.activityList[i].avgerageSpeed;
}
avgSpeed /= user.activityList.length;
avgSpeed = double.parse((avgSpeed).toStringAsFixed(2));
return avgSpeed.toString() + ' miles per hour';
}
void routeToHubView() {
_navigationService.navigateTo(HubViewRoute);
}
}
使用此代码:
Set<Polyline> _directionPolyline = {};
Polyline polyLine = Polyline(
polylineId: const PolylineId('direction'),
color: Colors.blue,
points: List.empty(growable: true),
width: 5,
startCap: Cap.roundCap,
endCap: Cap.roundCap,
jointType: JointType.round,
geodesic: true,
);
polyLine.points.add(LatLng(element.latitude, element.longitude));
polyLine.points.add(LatLng(element.latitude, element.longitude));
_directionPolyline.add(polyLine);
请重新排列代码...我只给出了片段。
return SizedBox(
height: 300,
child: GoogleMap(
mapType: MapType.normal,
onMapCreated: _onMapCreated,
initialCameraPosition: CameraPosition(
//target: LatLng(45.521563, -122.677433),
target: LatLng(47.6645740, -122.0411640),
zoom: 11.0,
),
polylines: _directionPolyline,
),
)
我试图在我的 Flutter Dart Android 应用程序的 GoogleMaps 小部件中显示多条折线,但它们没有出现。小部件和地图显示完美,但折线不存在。
当我的代码运行时,折线已成功添加到 _polylines,并且 GoogleMaps 小部件包含“折线:_polylines”,它们仍然不会显示。
有什么想法吗?
我的代码如下所示:
class TotalStatsViewModel extends BaseViewModel {
final _navigationService = locator<NavigationService>();
Set<Polyline> _polylines = HashSet<Polyline>();
GoogleMapController mapController;
Widget getWidget() {
if (getLoggedInUser().activityList.length != 0) {
return Column(
children: [
getMap(),
Text(
'Total Distance Biked:',
textScaleFactor: 2,
),
Text(
getTotalDistance(),
textScaleFactor: 1.5,
),
Text(
'Total Duration Biked:',
textScaleFactor: 2,
),
Text(
getTotalDuration(),
textScaleFactor: 1.5,
),
Text(
'Average Biking Speed:',
textScaleFactor: 2,
),
Text(
getAverageSpeed(),
textScaleFactor: 1.5,
),
Spacer(),
Padding(
padding: const EdgeInsets.all(10.0),
child: ElevatedButton(
onPressed: () {
routeToHubView();
},
child: Text('Return'),
)),
Row(), //Row is here to center the column by adding a max width element.
],
);
} else {
return Column(
children: [
Text(
'User needs at least one added activity to display statistics.',
textScaleFactor: 1.5,
textAlign: TextAlign.center,
),
Spacer(),
Padding(
padding: const EdgeInsets.all(10.0),
child: ElevatedButton(
onPressed: () {
routeToHubView();
},
child: Text('Return'),
)),
Row(), //Row is here to center the column by adding a max width element.
],
);
}
}
Widget getMap() {
for (int i = 0; i < getLoggedInUser().activityList.length; i++) {
constructPolyline(getLoggedInUser().activityList[i]);
}
return SizedBox(
height: 300,
child: GoogleMap(
mapType: MapType.normal,
onMapCreated: _onMapCreated,
initialCameraPosition: CameraPosition(
//target: LatLng(45.521563, -122.677433),
target: LatLng(47.6645740, -122.0411640),
zoom: 11.0,
),
polylines: _polylines,
),
);
}
void constructPolyline(Activity activity) {
print('CONSTRUCT POLYLINE CALLED');
List<LatLng> polylineLatLongs = [];
//fix with activity
Gpx gpx = GpxReader().fromString('<?xml version="1.0" encoding="UTF-8"?>'
'<gpx creator="StravaGPX" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd" version="1.1" xmlns="http://www.topografix.com/GPX/1/1" xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">'
'<metadata>'
'<time>2022-02-06T21:22:54Z</time>'
'</metadata>'
'<trk>'
'<name>Afternoon Ride</name>'
'<type>1</type>'
'<trkseg>'
'<trkpt lat="47.6645740" lon="-122.0411640">'
'<ele>113.0</ele>'
'<time>2022-02-06T21:22:54Z</time>'
'<extensions>'
'<power>0</power>'
'<gpxtpx:TrackPointExtension>'
'<gpxtpx:atemp>22</gpxtpx:atemp>'
'<gpxtpx:hr>85</gpxtpx:hr>'
'<gpxtpx:cad>37</gpxtpx:cad>'
'</gpxtpx:TrackPointExtension>'
'</extensions>'
'</trkpt>'
'<trkpt lat="47.6645750" lon="-122.0411670">'
'<ele>128.0</ele>'
'<time>2022-02-06T21:22:55Z</time>'
'<extensions>'
'<power>0</power>'
'<gpxtpx:TrackPointExtension>'
'<gpxtpx:atemp>22</gpxtpx:atemp>'
'<gpxtpx:hr>87</gpxtpx:hr>'
'<gpxtpx:cad>37</gpxtpx:cad>'
'</gpxtpx:TrackPointExtension>'
'</extensions>'
'</trkpt>');
//debug code
print('trks: ' + gpx.trks.length.toString());
print('trksegs: ' + gpx.trks[0].trksegs.length.toString());
print('trkpts: ' + gpx.trks[0].trksegs[0].trkpts.length.toString());
for (int i = 0; i < gpx.trks.length; i++) {
for (int j = 0; j < gpx.trks[i].trksegs.length; j++) {
for (int k = 0; k < gpx.trks[i].trksegs[j].trkpts.length; k++) {
polylineLatLongs.add(LatLng(gpx.trks[i].trksegs[j].trkpts[k].lat,
gpx.trks[i].trksegs[j].trkpts[k].lon));
print('ITERATION DONE');
}
}
}
print(polylineLatLongs.toString());
//polylineLatLongs.add(LatLng(47.664574, -122.041164));
//polylineLatLongs.add(LatLng(47.664575, -122.041167));
_polylines.add(Polyline(
polylineId: PolylineId('0'),
points: polylineLatLongs,
color: Colors.red,
visible: true,
width: 10));
print(_polylines.toString());
}
void _onMapCreated(GoogleMapController controller) {
mapController = controller;
}
String getTotalDistance() {
User user = getLoggedInUser();
double distanceSum = 0;
for (int i = 0; i < user.activityList.length; i++) {
distanceSum += user.activityList[i].distance;
}
distanceSum = double.parse((distanceSum).toStringAsFixed(2));
return distanceSum.toString() + ' miles';
}
String getTotalDuration() {
User user = getLoggedInUser();
int totalSeconds = 0;
for (int i = 0; i < user.activityList.length; i++) {
totalSeconds += user.activityList[i].duration.inSeconds;
}
Duration totalDuration = Duration(seconds: totalSeconds);
List<String> splitDistance = totalDuration.toString().split('.');
return splitDistance[0];
}
String getAverageSpeed() {
User user = getLoggedInUser();
double avgSpeed = 0;
for (int i = 0; i < user.activityList.length; i++) {
avgSpeed += user.activityList[i].avgerageSpeed;
}
avgSpeed /= user.activityList.length;
avgSpeed = double.parse((avgSpeed).toStringAsFixed(2));
return avgSpeed.toString() + ' miles per hour';
}
void routeToHubView() {
_navigationService.navigateTo(HubViewRoute);
}
}
使用此代码:
Set<Polyline> _directionPolyline = {};
Polyline polyLine = Polyline(
polylineId: const PolylineId('direction'),
color: Colors.blue,
points: List.empty(growable: true),
width: 5,
startCap: Cap.roundCap,
endCap: Cap.roundCap,
jointType: JointType.round,
geodesic: true,
);
polyLine.points.add(LatLng(element.latitude, element.longitude));
polyLine.points.add(LatLng(element.latitude, element.longitude));
_directionPolyline.add(polyLine);
请重新排列代码...我只给出了片段。
return SizedBox(
height: 300,
child: GoogleMap(
mapType: MapType.normal,
onMapCreated: _onMapCreated,
initialCameraPosition: CameraPosition(
//target: LatLng(45.521563, -122.677433),
target: LatLng(47.6645740, -122.0411640),
zoom: 11.0,
),
polylines: _directionPolyline,
),
)