Flutter地理编码与反地理编码插件flutter_nominatim的使用

发布于 1周前 作者 htzhanglong 来自 Flutter

Flutter地理编码与反地理编码插件flutter_nominatim的使用

插件banner

代码大小

flutter_nominatim

完全免费且开源! 与其他地理编码服务不同,Nominatim完全免费使用,无需API密钥。 您可以立即开始在应用程序中实现位置功能,而无需任何付款或API密钥设置。

示例截图 📸

地址搜索 坐标转地址 地址转坐标
实时搜索结果 将坐标转换为人类可读的地址 将地址转换为地理坐标

主要优势

特性 描述 优势
💰 免费 无API密钥,无定价层 相比付费地理编码服务节省数百美元
🔑 无需认证 无需API密钥或令牌 快速实现,无需设置麻烦
🌍 全球覆盖 全球地址数据库 在您的应用所在的地方运行
🚀 易于集成 简单的API方法 几分钟内即可上手
⚡ 性能优化 内置速率限制与缓存 平滑用户体验

功能概述

1. 地点搜索 🔍

  • 自动完成带去抖动
  • 实时搜索结果
  • 最相关的匹配项
  • 丰富的地点详情
  • 地点边界多边形

2. 地理编码服务

服务类型 描述 示例
正向地理编码 将地址转换为坐标 “伦敦桥” → (51.5074, -0.1278)
反向地理编码 将坐标转换为地址 (51.5074, -0.1278) → “伦敦桥,伦敦,英国”

3. 内置优化

  • 自动请求去抖动
  • 速率限制处理
  • 错误管理
  • 输入验证

快速开始

安装

dependencies:
  flutter_nominatim: ^1.0.0

基本用法

// 初始化
final nominatim = Nominatim.instance;

// 搜索地点
final results = await nominatim.search("London");

// 获取地址从坐标
final address = await nominatim.getAddressFromLatLng(51.5074, -0.1278);

// 获取坐标从地址
final coordinates = await nominatim.getLatLngFromAddress("London Bridge");

实现示例

自动完成搜索小部件

TextField(
  controller: searchController,
  decoration: const InputDecoration(
    hintText: 'Search places...',
    prefixIcon: Icon(Icons.search),
  ),
  onChanged: (query) {
    if (query.length >= 3) {
      nominatim.search(query).then((results) {
        // 处理结果
      });
    }
  },
)

使用指南

输入约束

参数 范围/格式 示例
纬度 -90 到 90 51.5074
经度 -180 到 180 -0.1278
搜索查询 至少3个字符 “London”

速率限制

  • 每秒最多1次请求
  • 内置请求管理
  • 自动请求排队

为什么它是免费且开源的

Nominatim由OpenStreetMap驱动,这是世界上最大的协作地图项目。这意味着:

  • 🆓 完全免费:无隐藏费用或订阅费用
  • 🔓 无需API密钥:立即开始开发
  • 🌐 社区驱动:来自全球贡献者的定期更新
  • 📈 不断改进:数据库每日增长和改进

引用要求

使用此插件时,请包含以下内容:

© OpenStreetMap contributors

更多关于Flutter地理编码与反地理编码插件flutter_nominatim的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter地理编码与反地理编码插件flutter_nominatim的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter应用中使用flutter_nominatim插件进行地理编码与反地理编码的示例代码。这个插件允许你将地理坐标(经纬度)转换为地址(反地理编码),以及将地址转换为地理坐标(地理编码)。

首先,你需要在pubspec.yaml文件中添加flutter_nominatim依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_nominatim: ^x.y.z  # 替换为最新版本号

然后运行flutter pub get来安装依赖。

接下来,下面是一个简单的示例,展示如何使用flutter_nominatim进行地理编码与反地理编码。

1. 导入必要的包

在你的Dart文件中导入flutter_nominatim包:

import 'package:flutter/material.dart';
import 'package:flutter_nominatim/flutter_nominatim.dart';

2. 初始化Nominatim服务

你需要一个Nominatim的API密钥(虽然一些基础功能可能不需要API密钥,但高级功能或大量请求通常需要)。你可以在Nominatim官网申请一个API密钥。

final nominatim = Nominatim(
  apiKey: 'YOUR_NOMINATIM_API_KEY', // 替换为你的API密钥
  languageCode: 'en', // 可选,设置返回地址的语言
);

3. 地理编码示例

将地址转换为地理坐标(经纬度):

Future<void> performGeocoding() async {
  try {
    final response = await nominatim.geocode(
      q: '1600 Amphitheatre Parkway, Mountain View, CA',
    );

    if (response.isSuccessful) {
      final location = response.data.first;
      print('Latitude: ${location.lat}');
      print('Longitude: ${location.lon}');
    } else {
      print('Geocoding failed with status: ${response.statusCode}');
    }
  } catch (e) {
    print('Error during geocoding: $e');
  }
}

4. 反地理编码示例

将地理坐标转换为地址:

Future<void> performReverseGeocoding() async {
  try {
    final response = await nominatim.reverseGeocode(
      latitude: 37.4219999,
      longitude: -122.0840575,
    );

    if (response.isSuccessful) {
      final address = response.data.first;
      print('Address: ${address.displayName}');
    } else {
      print('Reverse geocoding failed with status: ${response.statusCode}');
    }
  } catch (e) {
    print('Error during reverse geocoding: $e');
  }
}

5. 在UI中调用这些函数

你可以将这些函数绑定到按钮点击事件或其他UI交互上。例如:

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Nominatim Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () async {
                  await performGeocoding();
                },
                child: Text('Perform Geocoding'),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () async {
                  await performReverseGeocoding();
                },
                child: Text('Perform Reverse Geocoding'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

这个示例展示了如何在Flutter应用中使用flutter_nominatim插件进行地理编码与反地理编码。请确保替换YOUR_NOMINATIM_API_KEY为你的实际API密钥,并根据需要调整代码。

回到顶部