代码之家  ›  专栏  ›  技术社区  ›  tda

使用shapefile[duplicate]在Python中查找点的封闭多边形

  •  0
  • tda  · 技术社区  · 8 年前

    我有一个形状文件,其中包含一系列表示县的多边形。 我想知道Python中的一个函数/模块,它可以在给定单点坐标的情况下导出“边界”多边形。

    enter image description here

    我知道可能没有内置的功能来执行此操作,但任何关于如何执行此操作的建议都将非常好,谢谢!

    1 回复  |  直到 6 年前
        1
  •  0
  •   tda    8 年前

    理查德对一个类似问题的回答是最好的。

    在此处找到: https://stackoverflow.com/a/13433127/7019148

    复制如下以供将来参考:

    #!/usr/bin/python
    import ogr
    from IPython import embed
    import sys
    
    drv = ogr.GetDriverByName('ESRI Shapefile') #We will load a shape file
    ds_in = drv.Open("MN.shp")    #Get the contents of the shape file
    lyr_in = ds_in.GetLayer(0)    #Get the shape file's first layer
    
    #Put the title of the field you are interested in here
    idx_reg = lyr_in.GetLayerDefn().GetFieldIndex("P_Loc_Nm")
    
    #If the latitude/longitude we're going to use is not in the projection
    #of the shapefile, then we will get erroneous results.
    #The following assumes that the latitude longitude is in WGS84
    #This is identified by the number "4326", as in "EPSG:4326"
    #We will create a transformation between this and the shapefile's
    #project, whatever it may be
    geo_ref = lyr_in.GetSpatialRef()
    point_ref=ogr.osr.SpatialReference()
    point_ref.ImportFromEPSG(4326)
    ctran=ogr.osr.CoordinateTransformation(point_ref,geo_ref)
    
    def check(lon, lat):
        #Transform incoming longitude/latitude to the shapefile's projection
        [lon,lat,z]=ctran.TransformPoint(lon,lat)
    
        #Create a point
        pt = ogr.Geometry(ogr.wkbPoint)
        pt.SetPoint_2D(0, lon, lat)
    
        #Set up a spatial filter such that the only features we see when we
        #loop through "lyr_in" are those which overlap the point defined above
        lyr_in.SetSpatialFilter(pt)
    
        #Loop through the overlapped features and display the field of interest
        for feat_in in lyr_in:
            print lon, lat, feat_in.GetFieldAsString(idx_reg)
    
    #Take command-line input and do all this
    check(float(sys.argv[1]),float(sys.argv[2]))
    #check(-95,47)
    
    推荐文章