我在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
更新解决方案: 我正在更新此帖子,因为我找到了解决方案,希望它可以对某人有所帮助!
答案 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')])
即找到爱德华王子岛内的坐标。