2017-05-02 7 views
0

지오 코즈 (위도 경도)와 다른 레이어가있는 쉐이프 파일 목록이 있습니다. 각 계층이 속한 계층을 식별 할 수 있기를 원합니다.쉐이프 파일의 위도를 실제 값으로 변환

그러나 shape 파일 (.SHP)는 위도와 경도가 이상한 범위 내에서 숫자로 표현되는 poligons, 내가 아는 그런

120724.86008864로하고 484497.34058312 PRJ 파일이 변환이 얼마나에 대한 정보가 포함되어있다 만들었지 만 나는 방법을 얻는 것 같지 않아. 6377397.155,299.1528128], PRIMEM [ "가요", 0], 단위 [ "

PROJCS ["RD_New "GEOGCS ["GCS_Amersfoort "DATUM ["D_Amersfoort "구형 ["Bessel_1841 ": 이는 인 PARAMETER [ "False_Easting", 155000], PARAMETER [ "False_Northing", 463000], PARAMETER [ "Central_Meridian", 5.38763888888889], PARAMETER [ "Scale_Factor", 0.9999079], PROJECTION [0.0174532925199432955] PARAMETER [ "Latitude_Of_Origin", 52.15616055555555], UNIT [ "Meter", 1]

일반적인 위도/경도를 셰이프 파일의 모양으로 변환하는 방법에 대한 구체적인 질문이 있습니다.

이 라이브러리 http://gdal.org/python/

어떤 도움으로, 파이썬에서 작업에 감사드립니다.

+0

좌표를 가져 오시겠습니까? 또는 prj 파일을 구문 분석합니까? –

+0

문제없이 파일을 구문 분석 할 수 있지만 셰이프 파일의 위도/경도가 다른 배율 또는 범위에 있습니다. 예를 들어 120724.86008864의 위도는 분명히 잘못되었습니다. 저는 52.3605883과 같은 정상적인 위도를가집니다. 그래서 나는 파일의 그것들과 같아지기 위해서 어느 좌표를 정규 좌표계에 적용해야하는지 알고 싶습니다. 그러면 그 층의 폴리곤과 교차시킬 수있을 것입니다. –

답변

0
# define input 
shape_file = "file.shp" 
o_lat = 52.3605883 
o_lon = 4.8593157 

# geospatial bureocracy 
driver = ogr.GetDriverByName('ESRI Shapefile') 
shape = driver.Open(shape_file) 
layer = shape.GetLayer() 
geo_ref = layer.GetSpatialRef() 
point_ref = ogr.osr.SpatialReference() 
point_ref.ImportFromEPSG(4326) 
ctran = ogr.osr.CoordinateTransformation(point_ref, geo_ref) 

# critical part: transform longitude/latitude to the shapefile's projection 
[t_lon, t_lat, z] = ctran.TransformPoint(o_lon, o_lat) 
print('original coords', o_lon, o_lat) 
print('transformed coords', t_lon, t_lat) 

# create the needle 
point = ogr.Geometry(ogr.wkbPoint) 
point.SetPoint_2D(0, t_lon, t_lat) 
layer.SetSpatialFilter(point) 

# look it up 
for feature in layer: 
    polygon = feature.GetGeometryRef() 
    if polygon.Contains(point): 
     print('Found it', feature.ExportToJson() 
0
 import re 
     regex = "\d{1,3}\.\d+" 
     s ="""PROJCS["RD_New",GEOGCS["GCS_Amersfoort",DATUM["D_Amersfoort",SPHEROID["Bessel_1841",6377397.155,299.1528128]],PRIMEM["Greenwich",0],UNIT["Degree",0.0174532925199432955]],PROJECTION["Double_Stereographic"],PARAMETER["False_Easting",155000],PARAMETER["False_Northing",463000],PARAMETER["Central_Meridian",5.38763888888889],PARAMETER["Scale_Factor",0.9999079],PARAMETER["Latitude_Of_Origin",52.15616055555555],UNIT["Meter",1]] """ 

     m = re.search(regex, s) 

     if m: 
      print m.groups() 
+0

당신의 의도는 무엇입니까? –

+0

문자열에서 소수점 이하 최대 10 진수를 모두 얻고 싶습니다. 예 : 12.55 3.44 321.11 –