如何获得每个国家的边界
Posted
技术标签:
【中文标题】如何获得每个国家的边界【英文标题】:How to get the borders of each country 【发布时间】:2015-11-10 16:32:06 【问题描述】:我正在尝试获取世界上每个国家的边界多边形的坐标(纬度和经度),到目前为止我下载了这个数据集 (http://thematicmapping.org/downloads/world_borders.php)。
我能够以这种方式检索每个国家/地区的边界多边形
import shapefile
sf = shapefile.Reader("TM_WORLD_BORDERS-0.3.sph")
shapes = sf.shapes()
j = 0 # number of the country
lat = []; lon = []
for i in range(len(shapes[j].points)):
lat.append(shapes[j].points[i][0]);lon.append(shapes[j].points[i][1])
但是,我不明白如何获取与每个多边形相关联的国家/地区名称。
这可能是一个非常简单的问题,但我真的找不到解决方案。
我试图查看形状的属性,但国家名称似乎没有。
我下载的数据集包含一堆其他二进制文件,但我真的不知道它们是如何编写的,所以我希望有人可能熟悉 shapefile 库的这个数据集。
【问题讨论】:
是的!如果我这样做dir(shapes[0])
,这就是我得到的['__doc__', '__geo_interface__', '__init__', '__module__', 'bbox', 'parts', 'points', 'shapeType']
,但这并没有太大帮助。
已经这样做了。 shapeType
始终设置为 5,points
是边界多边形的坐标。我不知道bbox
和parts
是什么,但第一个是四个数字的列表,第二个是两个数字的列表。所以,这里没有名字的暗示。但是,在我下载的数据集中还有其他文件,所以名称可能在那里,但它们是二进制文件,我真的不知道它们是如何编写的。我只是希望有人熟悉这个数据集并能给我一些指示。
【参考方案1】:
对我来说这是可行的:
fname = "data/TM_WORLD_BORDERS-0.3/TM_WORLD_BORDERS-0.3.shp"
import shapefile
sf = shapefile.Reader(fname)
shapes = sf.shapeRecords()
shape = shapes[1]
print shape.record
points = shape.shape.points
【讨论】:
【参考方案2】:我测试了你的代码,好像是经纬度坐标颠倒了。
# -*- coding: utf-8 -*-
"""
Created on Wed Jun 2 21:22:58 2021
@author: yrtst
"""
import shapefile
fname = r'D:\222\444\TM_WORLD_BORDERS-0.3.shp'
sf = shapefile.Reader(fname,resolution='h')
shapes = sf.shapes()
j = 29# number of the country
lat = []; lon = []
for i in range(len(shapes[j].points)):
lat.append(shapes[j].points[i][1]);lon.append(shapes[j].points[i][0])
print(lat[2000])
print(lon[2000])
#Guess the countires!
#First find the approximate range of the coordinates of a country's border.
#Then traverse all the border data to find the intersection.
#Take China's latitude and longitude range as an example.
import shapefile
fname = r'D:\222\444\TM_WORLD_BORDERS-0.3.shp'
sf = shapefile.Reader(fname,resolution='h')
shapes = sf.shapes()
j=0
possible_lat=[]
possilbe_lon=[]
while j<246:
lat = []; lon = []
for i in range(len(shapes[j].points)):
lat.append(shapes[j].points[i][1]);lon.append(shapes[j].points[i][0])
#print(lat)
#print(lon)
#ll=[lat,lon]
#print(lon)
#the approximate range of the latitude
for check_lat in lat:
if 21<check_lat<24 :
possible_lat.append(j)
break
#the approximate range of the longitude
for check_lon in lon:
if 130<check_lon<133 :
possilbe_lon.append(j)
break
lat = []; lon = []
j+=1
#The data that appears in the following two lists at the same time
#is the country code we are looking for.
print(possible_lat)
print(possilbe_lon)
【讨论】:
以上是关于如何获得每个国家的边界的主要内容,如果未能解决你的问题,请参考以下文章