GDAL을 사용하여 shapefile에서 다각형의 총 면적을 계산 하시겠습니까?


11

British National Grid 투영에 shapefile이 있습니다.

Geometry: 3D Polygon
Feature Count: 5378
Extent: (9247.520209, 14785.170099) - (638149.173223, 1217788.569952)
Layer SRS WKT:
PROJCS["British_National_Grid",
    GEOGCS["GCS_airy",
        DATUM["OSGB_1936",
            SPHEROID["Airy_1830",6377563.396,299.3249646]],
        PRIMEM["Greenwich",0],
        UNIT["Degree",0.017453292519943295]],
    PROJECTION["Transverse_Mercator"],
    PARAMETER["latitude_of_origin",49],
    PARAMETER["central_meridian",-2],
    PARAMETER["scale_factor",0.9996012717],
    PARAMETER["false_easting",400000],
    PARAMETER["false_northing",-100000],
    UNIT["Meter",1]]
cat: Integer (9.0)

GDAL / OGR을 사용하여 셰이프 파일에있는 모든 다각형의 총 면적을 헥타르로 가져올 수 있습니까?

이 기능이 가능한지 궁금합니다 -sql.

ogrinfo -sql "SELECT SUM(ST_Area(geom::geography)) FROM mytable" myshapefile.shp

그러나 나는 그것을 얻는 것을 시도합니다 ERROR 1: Undefined function 'ST_Area' used..

Shapefile을 QGIS로 가져 와서 각 다각형에 면적 속성을 추가 한 다음 합산 할 수는 있지만 가능한 경우 명령 줄 도구를 사용하는 것이 좋습니다.

답변:


15

OGR SQL에는 OGR_GEOM_AREA 라는 특수 필드가 있습니다.이 필드 에는 형상의 형상 영역이 반환됩니다.

ogrinfo -sql "SELECT SUM(OGR_GEOM_AREA) AS TOTAL_AREA FROM myshapefile" myshapefile.shp

여기서, TOTAL_AREA측정의 단위는 레이어 SRS 의존하여 (아래 코멘트를 판독).


놀랄 만한! 이것은 나에게 준다 SUM_OGR_GEOM_AREA (Real) = 4459037129.50955. 이것은 헥타르 또는 다른 단위입니까? 그리고 소스 셰이프 파일이 어떤 투영에 있는지는 중요합니까?
Richard

1
측정 단위는 형상이 투영되는 방식에서 파생되므로 평방 미터입니다.
안토니오 팔 치아 노

1
대부분 m ^ 2에서 헥타르로 변환하기 위해 10000으로 나눕니다
dmci

감사! 방금 문서를 찾았습니다. gdal.org/classOGRSurface.html#a3b2c3125ec8c0b3a986e43cd1056f9e4 사용중인 공간 참조 시스템의 제곱 단위로 피처 영역을 반환합니다 . 전체 초보자는 죄송하지만 다른 SRS에서 shapefile을 사용하는 경우 특정 SRS의 제곱 단위가 무엇인지 어떻게 알 수 있습니까?
Richard

1
레이어 SRS WKT (예 : 투영 파일)를 보면 UNIT [ "Meter", 1]]
Antonio Falciano

6

예, 가능하지만 다음과 같이 OGR SQLite 언어 를 사용해야합니다 .

ogrinfo -dialect SQLite -sql 'SELECT SUM(ST_Area(geometry))/10000 FROM myshapefile' myshapefile.shp

또한 myshapefile의 레이어 이름 인지 확인 하십시오 myshapefile.shp. 다음과 같이 할 수 있습니다 :

ogrinfo myshapefile.shp

INFO: Open of `myshapefile.shp`
    using driver `ESRI Shapefile' successful.
1: myshapefile (Polygon)

감사! 실제로 나는 본다 no such column: geometry. 지오메트리 열이 무엇인지 어떻게 알 수 있습니까? 이것은의 출력입니다 ogrinfo -al -fid 1: OGRFeature(mylayer):1 cat (Integer) = 2 POLYGON ((463267.036276041297242 1216886.583904854720458 0,463267.693611663184129 1216956.525473011657596 0,463405.369117364054546 1216820.109560555079952 0,463404.712737055611797 1216750.1665881925728170,463267.036276041297242 1216886.583904854720458 0,463267.036276041297242 1216886.583904854720458 0)).
Richard

1
수행 ogrinfo -so -al하지만 @dmci, 나는 당신의 대답에 하나 개의 비트를 이해하지 않습니다 GDAL 셰이프 파일 항상 하나 개의 층이 있고 그 이름은 Shape 파일의 기본 이름입니다. "myshapefile"대신 "mytable"이라는 이름을 어떻게 얻을 수 있습니까?
user30184

감사! 해당 명령의 출력은 원래 질문에 있습니다.
Richard

@ user30184-완전히 동의하지만 OP가 질문에 사용한 명명 규칙을 복제했습니다. 일관성을 유지하기 위해 본인의 답변을 업데이트했습니다.
dmci

2
좋아, 그것은 드라이버 특정 것 같습니다. 일부 드라이버 Geometry Column = GEOMETRY는 ogrinfo -so -al 과 같이보고 하지만 shapefile 드라이버는 그렇지 않습니다. shapefile을 사용하면 이름이 OGR SQL 언어 ( gdal.org/ogr_sql.html의 특수 필드 참조 )의 경우 " OGR_GEOMETRY "이고 SQLite 언어의 경우 "geometry"라고 가정합니다.
user30184

4

QGIS를 사용하여이 간단한 코드를 실행하여 쉐이프 파일의 전체 영역을 인쇄 할 수 있습니다 (투영 된 참조 시스템에서 영역을 평가한다고 가정).

from qgis.core import *

filepath = 'C:/Users/path_to_the_shapefile/shapefile.shp'
layer = QgsVectorLayer(filepath, 'layer' , 'ogr')

area = 0
for feat in layer.getFeatures():
    area += feat.geometry().area()

print area # total area in square meters

print area/10000 # total area in hectares
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.