# -*- 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中可以轻松获取。