Version arc: 10,3
Au cas où quelqu'un trouverait encore cela en 2019 , j'ai eu des problèmes similaires et je voulais être aussi sûr que possible de savoir si les projections correspondaient. Comme dans les questions / réponses ci-dessus, vous pouvez obtenir la référence spatiale en utilisant arcpy.Describe(dataset).spatialReference
. Dans ma bibliothèque de fonctions, j'intègre ensuite cela dans un workflow, configuré pour gérer la comparaison de 2 jeux de données.
Les attributs individuels d'un objet de référence spatiale de géotraitement sont disponibles ici .
Les fonctions suivantes devraient aider - n'hésitez pas à utiliser / modifier bien sûr. Il vaut la peine de vérifier ce qui est omis - certains attributs des systèmes de référence spatiale seront inoffensifs s'ils ne correspondent pas, mais cela dépend de vous :)
import arcpy
def check_crs(dataset):
"""Return a coordinate reference system string
Get coordinate reference system of dataset
"""
crs = arcpy.Describe(dataset).spatialReference
return(crs)
def assert_crs_attribs(dataset1, dataset2, strict=False):
"""Returns Nothing
Asserts equality of all attributes of the provided geoprocessing spatial reference objects.
These are generated using arcpy.Describe(your_dataset).spatialReference.
Attributes of spatial reference object: https://pro.arcgis.com/en/pro-app/arcpy/classes/spatialreference.htm
dataset1 - a spatial dataset with projection info e.g. shp
dataset2 - a spatial dataset with projection info e.g. shp
strict - boolean - if True will compare every element (default: False)
"""
crs1=check_crs(dataset1)
crs2=check_crs(dataset2)
try:
# Consider these
assert(crs1.name==crs2.name) # The name of the spatial reference.
assert(crs1.PCSCode==crs2.PCSCode) # The projected coordinate system code.1
assert(crs1.PCSName==crs2.PCSName) # The projected coordinate system name.1
assert(crs1.azimuth==crs2.azimuth) # The azimuth of a projected coordinate system.1
assert(crs1.centralMeridian==crs2.centralMeridian) # The central meridian of a projected coordinate system.1
assert(crs1.centralMeridianInDegrees==crs2.centralMeridianInDegrees) # The central meridian (Lambda0) of a projected coordinate system in degrees.1
assert(crs1.centralParallel==crs2.centralParallel) # The central parallel of a projected coordinate system.1
assert(crs1.falseEasting==crs2.falseEasting) # The false easting of a projected coordinate system.1
assert(crs1.falseNorthing==crs2.falseNorthing) # The false northing of a projected coordinate system.1
assert(crs1.MFalseOriginAndUnits==crs2.MFalseOriginAndUnits) # The measure false origin and units.
assert(crs1.MResolution==crs2.MResolution) # The measure resolution.
assert(crs1.MTolerance==crs2.MTolerance) # The measure tolerance.
assert(crs1.XYTolerance==crs2.XYTolerance) # The xy tolerance.
assert(crs1.ZDomain==crs2.ZDomain) # The extent of the z domain.
assert(crs1.ZFalseOriginAndUnits==crs2.ZFalseOriginAndUnits) # The z false origin and units.
assert(crs1.factoryCode==crs2.factoryCode) # The factory code or well-known ID (WKID) of the spatial reference.
assert(crs1.isHighPrecision==crs2.isHighPrecision) # Indicates whether the spatial reference has high precision set.
assert(crs1.latitudeOf1st==crs2.latitudeOf1st) # The latitude of the first point of a projected coordinate system.1
assert(crs1.latitudeOf2nd==crs2.latitudeOf2nd) # The latitude of the second point of a projected coordinate system.1
assert(crs1.latitudeOfOrigin==crs2.latitudeOfOrigin) # The latitude of origin of a projected coordinate system.1
assert(crs1.linearUnitCode==crs2.linearUnitCode) # The linear unit code.
assert(crs1.linearUnitName==crs2.linearUnitName) # The linear unit name.1
assert(crs1.longitude==crs2.longitude) # The longitude value of this prime meridian.1
assert(crs1.longitudeOf1st==crs2.longitudeOf1st) #The longitude of the first point of a projected coordinate system.1
assert(crs1.longitudeOf2nd==crs2.longitudeOf2nd) # The longitude of the second point of a projected coordinate system.1
assert(crs1.longitudeOfOrigin==crs2.longitudeOfOrigin) # The longitude of origin of a projected coordinate system.1
assert(crs1.metersPerUnit==crs2.metersPerUnit) # The meters per linear unit.1
assert(crs1.projectionCode==crs2.projectionCode) # The projection code.1
assert(crs1.projectionName==crs2.projectionName) # The projection name.1
assert(crs1.scaleFactor==crs2.scaleFactor) # The scale factor of a projected coordinate system.1
assert(crs1.standardParallel1==crs2.standardParallel1) # The first parallel of a projected coordinate system.1
assert(crs1.standardParallel2==crs2.standardParallel2) # The second parallel of a projected coordinate system.1
assert(crs1.angularUnitCode==crs2.angularUnitCode) # The angular unit code.2
assert(crs1.angularUnitName==crs2.angularUnitName) # The angular unit name.2
assert(crs1.datumCode==crs2.datumCode) # The datum code.2
assert(crs1.datumName==crs2.datumName) # The datum name.2
assert(crs1.flattening==crs2.flattening) # The flattening ratio of this spheroid.2
assert(crs1.longitude==crs2.longitude) # The longitude value of this prime meridian.2
assert(crs1.primeMeridianCode==crs2.primeMeridianCode) # The prime meridian code.2
## Prob can be ignored
if strict:
assert(crs1.ZResolution==crs2.ZResolution) # The z resolution property.
assert(crs1.ZTolerance==crs2.ZTolerance) # The z-tolerance property.
assert(crs1.hasMPrecision==crs2.hasMPrecision) # Indicates whether m-value precision information has been defined.
assert(crs1.hasXYPrecision==crs2.hasXYPrecision) # Indicates whether xy precision information has been defined.
assert(crs1.hasZPrecision==crs2.hasZPrecision) # Indicates whether z-value precision information has been defined.
assert(crs1.XYResolution==crs2.XYResolution) # The xy resolution.
assert(crs1.domain==crs2.domain) # The extent of the xy domain.
assert(crs1.MDomain==crs2.MDomain) # The extent of the measure domain.
assert(crs1.remarks==crs2.remarks) # The comment string of the spatial reference.
assert(crs1.type==crs2.type) # The type of the spatial reference. Geographic: A geographic coordinate system. Projected: A projected coordinate system.
assert(crs1.usage==crs2.usage) # The usage notes.
assert(crs1.classification==crs2.classification) # The classification of a map projection.1
assert(crs1.GCSCode==crs2.GCSCode) # The geographic coordinate system code.2
assert(crs1.GCSName==crs2.GCSName) # The geographic coordinate system name.2
assert(crs1.primeMeridianName==crs2.primeMeridianName) # The prime meridian name.2
assert(crs1.radiansPerUnit==crs2.radiansPerUnit) # The radians per angular unit.2
assert(crs1.semiMajorAxis==crs2.semiMajorAxis) # The semi-major axis length of this spheroid.2
assert(crs1.semiMinorAxis==crs2.semiMinorAxis) # The semi-minor axis length of this spheroid.2
assert(crs1.spheroidCode==crs2.spheroidCode) # The spheroid code.2
assert(crs1.spheroidName==crs2.spheroidName) # The spheroid name.2
return(True)
except:
output_message="CRS differs between datasets."#\ncrs1: %s\ncrs2 : %s" %(crs1.exportToString(), crs2.exportToString())
print(output_message)
return(False)
## Differs to the falseEasting and falseNorthingUnits are odd on occasion but false eastings and northings make sense
# crs.falseOriginAndUnits # The false origin and units.
## Not required
#crs.GCS # A projected coordinate system returns a SpatialReference object for the geographic coordinate system it is based on. A geographic crs.coordinate system returns the same SpatialReference.
#crs.SpatialReference
#crs.VCS # If the coordinate system has a vertical coordinate system, it returns a VCS object for the vertical coordinate system it is based on.
#crs.abbreviation # The abbreviated name of the spatial reference.
#crs.alias # The alias of the spatial reference.
Compte tenu de ce qui précède, vous pouvez les utiliser comme:
dataset1="your_vector_1.shp"
dataset2="your_vector_2.shp"
assert_crs_attribs(dataset1, dataset2)
Compte tenu de votre cas d'utilisation, espérons que les assertions n'échoueront pas.
J'intègre maintenant ces fonctions dans de nombreux processus, par exemple lorsque j'ai une gamme d'ensembles de données spatiales que je rejoins et je veux éliminer tout doute que les choses étaient mal alignées.