如何获得每个国家的边界

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 是边界多边形的坐标。我不知道bboxparts 是什么,但第一个是四个数字的列表,第二个是两个数字的列表。所以,这里没有名字的暗示。但是,在我下载的数据集中还有其他文件,所以名称可能在那里,但它们是二进制文件,我真的不知道它们是如何编写的。我只是希望有人熟悉这个数据集并能给我一些指示。 【参考方案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)  

【讨论】:

以上是关于如何获得每个国家的边界的主要内容,如果未能解决你的问题,请参考以下文章

国家边界坐标数据

从 topojson 获取各个国家的边界​​框

国家边界的纬度/经度数据集[关闭]

计算两点之间的距离,包括国家边界信息

如何从R中的州边界获取纬度和经度数据

我怎样才能获得每个国家的最大值