如何知道形状文件中的多边形内的坐标是否不起作用?

时间:2018-11-29 23:58:18

标签: python shapely

我在Excel文档中有坐标(纬度和经度)。我有一个shapefile,其中包含加拿大不同省份的所有形状。我希望能够在excel中生成一个新字段,以便将不同的坐标分类到不同的加拿大省份。我尝试了以下代码,但无法正常工作。

import fiona
import shapely.geometry 

with fiona.open(r"D:\Users\Jonathan\Desktop\CRA-Project v2\Census Division\lcd_000b16a_e.shp") as fiona_collection:

shapefile_record = fiona_collection.next()

# Use Shapely to create the polygon
shape = shapely.geometry.asShape(shapefile_record['geometry'])
#print(shape)

point = shapely.geometry.Point(46.362914,-63.503809) # longitude, latitude

# Alternative: if point.within(shape)
if shape.contains(point):
    print("Found shape for point.")

更新1:     点= shapely.geometry.Point(46.362914,-63.503809)

多边形: Link

更新解决方案: 我正在更新此帖子,因为我找到了解决方案,希望它可以对某人有所帮助!

  1. 如果您使用shapefile,则有一个与     它(文档)
  2. 查看文档并确定哪个         它正在使用的投影。例如:在加拿大是兰伯特         保形圆锥形。
  3. 将纬度/经度转换为投影当量
  4. 在shapefile中循环查找新的经/纬度 等效项在面/多面内。你可以用     python!

1 个答案:

答案 0 :(得分:0)

这有几个问题。首先,您的shapefile(多面体)似乎处于不同的投影中,因此要在经度/纬度坐标中工作,需要对其进行转换。此外,即使在转换之后,x坐标仍是经度,因此应交换要测试的点的坐标。一个示例可能如下所示。假定输入投影为PCS_Lambert_Conformal_Conic(EPSG:3347)-在随附的prj文件中指定。

from functools import partial
import sys

import fiona
from shapely.geometry import Point, Polygon, asShape
from shapely.ops import transform
from shapely.wkt import loads
import pyproj

project = partial(
    pyproj.transform,
    pyproj.Proj(init='epsg:3347'),
    pyproj.Proj(init='epsg:4326'))

P = Point(-63.503809, 46.362914)
with fiona.open(sys.argv[1]) as F:
    for idx,feature in enumerate(F):
        G = transform(project, asShape(feature['geometry']))
        if G.contains(P):
            print(feature['properties'])
            break

这将产生:

OrderedDict([('CDUID', '1102'), ('CDNAME', 'Queens'), ('CDTYPE', 'CTY'), ('PRUID', '11'), ('PRNAME', 'Prince Edward Island / Île-du-Prince-Édouard')])

即找到爱德华王子岛内的坐标。