求取矢量图形的四至

# -*- coding: utf-8 -*-
import arcpy
import sys

reload(sys)
sys.setdefaultencoding('utf-8')


def get_cardinal_points(geometry):
    if geometry.type == 'point':
        return {'xy': '{},{}'.format(geometry.firstPoint.X, geometry.firstPoint.Y)}
    elif geometry.type == 'polyline':
        start_point = geometry.firstPoint
        end_point = geometry.lastPoint
        return {
            'Start': '{} {}'.format(start_point.X, start_point.Y),
            'End': '{} {}'.format(end_point.X, end_point.Y)
        } if start_point and end_point else {'Start': None, 'End': None}
    elif geometry.type == 'polygon':
        points = geometry.getPart(0)
        extremes = {'North': None, 'South': None, 'East': None, 'West': None}
        for point in points:
            if extremes['North'] is None or point.Y > extremes['North'][1]:
                extremes['North'] = (point.X, point.Y)
            if extremes['South'] is None or point.Y < extremes['South'][1]:
                extremes['South'] = (point.X, point.Y)
            if extremes['East'] is None or point.X > extremes['East'][0]:
                extremes['East'] = (point.X, point.Y)
            if extremes['West'] is None or point.X < extremes['West'][0]:
                extremes['West'] = (point.X, point.Y)
        return {k: '{},{}'.format(v[0], v[1]) if v else None for k, v in extremes.items()}


input_feature_class = arcpy.GetParameterAsText(0)

if not arcpy.Exists(input_feature_class):
    arcpy.AddError('Cannot open input feature class: {}'.format(input_feature_class))
    sys.exit(1)

geometry_type = arcpy.Describe(input_feature_class).shapeType
field_mapping = {
    'Point': ['xy'],
    'Polyline': ['Start', 'End'],
    'Polygon': ['North', 'South', 'East', 'West']
}
fields = field_mapping.get(geometry_type, [])

existing_fields = {f.name for f in arcpy.ListFields(input_feature_class)}
for field in fields:
    if field not in existing_fields:
        arcpy.AddField_management(input_feature_class, field, 'TEXT')

with arcpy.da.UpdateCursor(input_feature_class, ['SHAPE@'] + fields) as cursor:
    for row in cursor:
        geometry = row[0]
        points = get_cardinal_points(geometry)
        for i, field in enumerate(fields):
            row[i + 1] = points.get(field, None)
        cursor.updateRow(row)

在地理数据处理的过程中,四至是矢量图形的基本属性,通过上述代码在gis中可以轻松获取。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值