golang获取国家和行政区划数据的插件库gountries的使用

golang获取国家和行政区划数据的插件库gountries的使用

gountries是一个Golang库,提供了国家(ISO-3166-1)、行政区划(ISO-3166-2)、货币(ISO 4217)、地理坐标(ISO-6709)等数据,以及翻译、国家边界等信息。

安装

go get github.com/pariz/gountries

基础示例

package main

import (
	"fmt"
	"github.com/pariz/gountries"
)

func main() {
	query := gountries.New()

	/////////////////
	// 查找瑞典 //
	/////////////////

	sweden, _ := query.FindCountryByName("sweden")
	// sweden, _ := query.FindCountryByAlpha("SE")
	// sweden, _ := query.FindCountryByAlpha("SWE")

	fmt.Println(sweden.Name.Common)   // 输出: Sweden
	fmt.Println(sweden.Name.Official) // 输出: Konungariket Sverige

	fmt.Println(sweden.Translations["DEU"].Common)   // 输出: Schweden
	fmt.Println(sweden.Translations["DEU"].Official) // 输出: Königreich Schweden
}

进阶示例

package main

import (
	"fmt"
	"github.com/pariz/gountries"
)

func main() {

	query := gountries.New()

	////////////////////////////////////////////
	// 查找瑞典的邻国 //
	////////////////////////////////////////////

	sweden, _ := query.FindCountryByAlpha("SWE") // "SE" 也可以使用

	// 获取瑞典的邻国
	for _, country := range sweden.BorderingCountries() {
		fmt.Println(country.Name.Common)
	}

	// 输出:
	// Finland
	// Norway

	////////////////////////////////////
	// 查找瑞典的所有行政区划 //
	////////////////////////////////////

	subdivisions := sweden.SubDivisions()

	for _, subdivision := range subdivisions {
		fmt.Println(subdivision.Name)
	}

	// 输出:
	// Västerbottens län
	// Uppsala län
	// Södermanlands län
	// Gotlands län
	// Dalarnas län
	// ...

	//////////////////////////////////////////////////////////
	// 查找所有与德国和瑞士接壤的国家 //
	//////////////////////////////////////////////////////////

	countryQuery := gountries.Country{
		Borders: []string{
			"DEU",
			"CHE",
		},
	}

	countries := query.FindCountries(countryQuery)

	for _, c := range countries {
		fmt.Println(c.Name.Common)
	}

	// 输出:
	// Austria
	// France

	///////////////////////////////////////////////////////////////////
	// 计算瑞典和德国之间的距离(以公里为单位) //
	///////////////////////////////////////////////////////////////////

	se, _ := query.FindCountryByAlpha("SWE")
	de, _ := query.FindCountryByAlpha("DEU")

	distance := gountries.MeasureDistanceHaversine(se, de)
	//distance := MeasureDistancePythagoras(se, de)

	fmt.Println(distance)

	// 输出:
	// 1430.1937864547901

	distance = gountries.CalculateHaversine(
		se.Coordinates.MaxLatitude, se.Coordinates.MaxLongitude,
		de.Coordinates.MinLatitude, de.Coordinates.MinLongitude)

	fmt.Println(distance)

	// 输出:
	// 2641.26145088825
}

使用打包数据

data/yaml子目录中的数据使用go-bindata嵌入。一旦你在项目中包含这个库,就不需要访问数据目录了。要添加或更新数据,修改YAML文件然后运行:

go-bindata -pkg gountries data/yaml/*

待办事项

  • 省/县查询(部分完成)
  • 坐标之间的测量(已完成)
  • GeoJSON信息
  • 建议?

更多关于golang获取国家和行政区划数据的插件库gountries的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang获取国家和行政区划数据的插件库gountries的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用gountries库获取国家和行政区划数据

gountries是一个用于获取国家和行政区划数据的Go语言库,它提供了丰富的国家信息、行政区划数据以及相关查询功能。下面我将详细介绍如何使用这个库。

安装

首先安装gountries库:

go get github.com/pariz/gountries

基本用法

1. 初始化

package main

import (
	"fmt"
	"github.com/pariz/gountries"
)

func main() {
	// 初始化gountries实例
	countries := gountries.New()
	
	// 使用示例...
}

2. 获取所有国家

func getAllCountries(countries *gountries.Countries) {
	// 获取所有国家
	allCountries, err := countries.FindAllCountries()
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	// 打印国家数量
	fmt.Printf("Total countries: %d\n", len(allCountries))

	// 打印前5个国家
	for i, country := range allCountries[:5] {
		fmt.Printf("%d. %s (%s)\n", i+1, country.Name.Common, country.Alpha2)
	}
}

3. 按国家代码查询

func queryByCode(countries *gountries.Countries) {
	// 按ISO 3166-1 alpha-2代码查询
	country, err := countries.FindCountryByAlpha("CN")
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	fmt.Printf("Country: %s\n", country.Name.Common)
	fmt.Printf("Official Name: %s\n", country.Name.Official)
	fmt.Printf("Capital: %s\n", country.Capital)
	fmt.Printf("Region: %s\n", country.Region)
	fmt.Printf("Subregion: %s\n", country.Subregion)
	fmt.Printf("Languages: %v\n", country.Languages)
	fmt.Printf("Currency: %s\n", country.Currencies[0].Name)
}

4. 按名称查询国家

func queryByName(countries *gountries.Countries) {
	// 按名称查询国家
	country, err := countries.FindCountryByName("Japan")
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	fmt.Printf("Japan's alpha-2 code: %s\n", country.Alpha2)
	fmt.Printf("Japan's capital: %s\n", country.Capital)
}

5. 获取国家的行政区划

func getSubdivisions(countries *gountries.Countries) {
	// 获取中国的行政区划
	subdivisions, err := countries.FindSubdivisions("CN")
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	// 打印部分行政区划
	fmt.Printf("China has %d subdivisions\n", len(subdivisions))
	for code, sub := range subdivisions {
		if code == "BJ" || code == "SH" || code == "GD" {
			fmt.Printf("%s: %s\n", code, sub.Name)
		}
	}
}

6. 按经纬度查询国家

func queryByCoordinates(countries *gountries.Countries) {
	// 按经纬度查询国家
	country, err := countries.FindCountryByCoordinates(35.6762, 139.6503) // 东京坐标
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	fmt.Printf("Country at Tokyo coordinates: %s\n", country.Name.Common)
}

高级用法

1. 获取国家边界信息

func getBorders(countries *gountries.Countries) {
	// 获取德国的邻国
	germany, err := countries.FindCountryByAlpha("DE")
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	fmt.Printf("Germany borders with:\n")
	for _, alpha3 := range germany.Borders {
		neighbor, err := countries.FindCountryByAlpha(alpha3)
		if err != nil {
			continue
		}
		fmt.Printf("- %s (%s)\n", neighbor.Name.Common, neighbor.Alpha2)
	}
}

2. 获取国家电话区号

func getCallingCodes(countries *gountries.Countries) {
	// 获取美国的电话区号
	usa, err := countries.FindCountryByAlpha("US")
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	fmt.Printf("USA calling codes: %v\n", usa.CallingCodes)
}

3. 获取国家时区

func getTimeZones(countries *gountries.Countries) {
	// 获取俄罗斯的时区
	russia, err := countries.FindCountryByAlpha("RU")
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	fmt.Printf("Russia time zones: %v\n", russia.TimeZones)
}

完整示例

package main

import (
	"fmt"
	"github.com/pariz/gountries"
)

func main() {
	countries := gountries.New()

	// 1. 获取所有国家
	fmt.Println("=== All Countries ===")
	getAllCountries(countries)

	// 2. 按代码查询
	fmt.Println("\n=== Query by Code ===")
	queryByCode(countries)

	// 3. 按名称查询
	fmt.Println("\n=== Query by Name ===")
	queryByName(countries)

	// 4. 获取行政区划
	fmt.Println("\n=== Subdivisions ===")
	getSubdivisions(countries)

	// 5. 按坐标查询
	fmt.Println("\n=== Query by Coordinates ===")
	queryByCoordinates(countries)

	// 6. 获取边界国家
	fmt.Println("\n=== Border Countries ===")
	getBorders(countries)

	// 7. 获取电话区号
	fmt.Println("\n=== Calling Codes ===")
	getCallingCodes(countries)

	// 8. 获取时区
	fmt.Println("\n=== Time Zones ===")
	getTimeZones(countries)
}

// 前面定义的所有函数...

总结

gountries库提供了丰富的功能来查询国家和行政区划数据,包括:

  • 按名称、代码、坐标查询国家
  • 获取国家详细信息(首都、语言、货币等)
  • 获取行政区划数据
  • 查询邻国、电话区号、时区等信息

这个库非常适合需要处理国际化和本地化数据的应用程序,或者任何需要国家/地区信息的项目。

回到顶部