我正在使用 openstreet 地图插件,目前还没有在地图上添加标记点击监听器的方法,因此我想从 flutter 方面添加它。我唯一能做到的方法是将它与堆栈小部件一起使用并找到地图的坐标,然后将这些坐标转换为 PixelCoordinates 并将该信息用于位置小部件属性,左侧和顶部。
在 initState 中,我已将点击坐标转换为普通像素坐标
@override
void initState() {
super.initState();
osmController = MapController(
initMapWithUserPosition: true,
);
osmController!.addObserver(this);
osmController!.listenerMapSingleTapping.addListener(() async {
GeoPoint? p = osmController!.listenerMapSingleTapping.value;
print(p);
LatLng latLng = LatLng(p!.latitude, p.longitude);
num worldWidth = 256 * pow(2, 18);
print('map worldwidth $worldWidth');
double pixelX = (latLng.longitude + 180) / 360 * worldWidth;
double sinLatitude = sin(latLng.latitude * pi / 180);
double pixelY =
(0.5 - log((1 + sinLatitude) / (1 - sinLatitude)) / (4 * pi)) *
worldWidth;
print('Pixel point: Point($pixelX, $pixelY)');
});
}
我得到的结果是
Pixel point: (49464318.85714286, 28176661.14285714)
现在,我想在我定位的小部件中使用这个值来显示这样的图标
class _TestScreenState extends State<TestScreen> with OSMMixinObserver {
late MapController? osmController;
late Point<double> pixelLocation = Point(0, 0);
final GlobalKey _mapKey = GlobalKey();
late Position position;
late GeoPoint? initPos;
@override
Widget build(BuildContext context) {
return Stack(
children: [
osmFlutter(mapKey: _mapKey, osmController: osmController),
Positioned(
left: 49464318.85714286,
top: 28176661.14285714,
//child: Transform.translate(
//offset: Offset(pixelLocation.x, pixelLocation.y),
child: Icon(
Icons.location_on,
size: 24,
color: Colors.red,
),
// ),
),
Positioned(
bottom: 10.0,
left: 10.0,
child: ElevatedButton(
onPressed: _addMarker,
child: Text('Add Marker'),
),
),
],
);
}
我不确定这种方法是否有效,只是想听听意见,
left: 49464318.85714286,top: 28176661.14285714,
的值似乎太离谱了,但像素坐标是正确的。有什么建议吗?