def createOutput(self, outputFC): """Creates an Output Feature Class with the Directional Mean Results. INPUTS: outputFC (str): path to the output feature class """ #### Validate Output Workspace #### ERROR.checkOutputPath(outputFC) #### Shorthand Attributes #### ssdo = self.ssdo caseField = self.caseField #### Create Output Feature Class #### ARCPY.SetProgressor("default", ARCPY.GetIDMessage(84003)) tempCFLayer = "tmpCFLayer" try: DM.MakeFeatureLayer(ssdo.inputFC, tempCFLayer) first = True for key, value in self.cf.iteritems(): oids = value[0] for oid in oids: sqlString = ssdo.oidName + '=' + str(oid) if first: DM.SelectLayerByAttribute(tempCFLayer, "NEW_SELECTION", sqlString) first = False else: DM.SelectLayerByAttribute(tempCFLayer, "ADD_TO_SELECTION", sqlString) UTILS.clearExtent(DM.CopyFeatures(tempCFLayer, outputFC)) except: ARCPY.AddIDMessage("ERROR", 210, outputFC) raise SystemExit() #### Set Attribute #### self.outputFC = outputFC
def calculateAreas(inputFC, outputFC): """Creates a new feature class from the input polygon feature class and adds a field that includes the area of the polygons. INPUTS: inputFC (str): path to the input feature class outputFC (str): path to the output feature class """ #### Validate Output Workspace #### ERROR.checkOutputPath(outputFC) outPath, outName = OS.path.split(outputFC) #### Create SSDataObject #### ssdo = SSDO.SSDataObject(inputFC, templateFC = outputFC, useChordal = False) #### Assure Polygon FC #### if ssdo.shapeType.lower() != "polygon": ARCPY.AddIDMessage("ERROR", 931) raise SystemExit() #### Check Number of Observations #### cnt = UTILS.getCount(inputFC) ERROR.errorNumberOfObs(cnt, minNumObs = 1) #### Copy Features #### try: clearCopy = UTILS.clearExtent(DM.CopyFeatures) clearCopy(inputFC, outputFC) except: ARCPY.AddIDMessage("ERROR", 210, outputFC) raise SystemExit() #### Add Area Field #### areaFieldNameOut = ARCPY.ValidateFieldName(areaFieldName, outPath) if not ssdo.allFields.has_key(areaFieldNameOut): UTILS.addEmptyField(outputFC, areaFieldNameOut, "DOUBLE") #### Calculate Field #### clearCalc = UTILS.clearExtent(DM.CalculateField) clearCalc(outputFC, areaFieldNameOut, "!shape.area!", "PYTHON_9.3")
def createOutput(self, outputFC): """Creates an Output Feature Class with the Median Centers. INPUTS: outputFC (str): path to the output feature class """ #### Validate Output Workspace #### ERROR.checkOutputPath(outputFC) #### Shorthand Attributes #### ssdo = self.ssdo caseField = self.caseField attFields = self.attFields #### Create Output Feature Class #### ARCPY.SetProgressor("default", ARCPY.GetIDMessage(84003)) outPath, outName = OS.path.split(outputFC) try: DM.CreateFeatureclass(outPath, outName, "POINT", "", ssdo.mFlag, ssdo.zFlag, ssdo.spatialRefString) except: ARCPY.AddIDMessage("ERROR", 210, outputFC) raise SystemExit() #### Add Field Names #### dataFieldNames = UTILS.getFieldNames(mdcFieldNames, outPath) shapeFieldNames = ["SHAPE@"] for fieldName in dataFieldNames: UTILS.addEmptyField(outputFC, fieldName, "DOUBLE") caseIsDate = False if caseField: fcCaseField = ssdo.allFields[caseField] validCaseName = UTILS.validQFieldName(fcCaseField, outPath) caseType = UTILS.convertType[fcCaseField.type] UTILS.addEmptyField(outputFC, validCaseName, caseType) dataFieldNames.append(validCaseName) if caseType.upper() == "DATE": caseIsDate = True if attFields: for attField in attFields: fcAttField = ssdo.allFields[attField] validAttName = UTILS.validQFieldName(fcAttField, outPath) if caseField: if validCaseName == validAttName: validAttName = ARCPY.GetIDMessage(84195) UTILS.addEmptyField(outputFC, validAttName, "DOUBLE") dataFieldNames.append(validAttName) outShapeFileBool = UTILS.isShapeFile(outputFC) #### Add Median X, Y, Dim #### allFieldNames = shapeFieldNames + dataFieldNames rows = DA.InsertCursor(outputFC, allFieldNames) for case in self.caseKeys: #### Median Centers #### medX, medY = self.medianCenter[case] pnt = (medX, medY, ssdo.defaultZ) rowResult = [pnt, medX, medY] #### Set Attribute Fields #### if caseField: caseValue = case.item() if caseIsDate: caseValue = TUTILS.iso2DateTime(caseValue) rowResult.append(caseValue) #### Set Attribute Fields #### if attFields: for attInd, attField in enumerate(self.attFields): medAtt = self.attCenter[case][attInd] rowResult.append(medAtt) rows.insertRow(rowResult) #### Clean Up #### del rows #### Set Attribute #### self.outputFC = outputFC
def createOutput(self, outputFC): """Creates an Output Feature Class with the Standard Distances. INPUTS: outputFC (str): path to the output feature class """ #### Validate Output Workspace #### ERROR.checkOutputPath(outputFC) #### Shorthand Attributes #### ssdo = self.ssdo caseField = self.caseField #### Increase Extent if not Projected #### if ssdo.spatialRefType != "Projected": sdValues = self.sd.values() if len(sdValues): maxRadius = max(sdValues) largerExtent = UTILS.increaseExtentByConstant(ssdo.extent, constant = maxRadius) largerExtent = [ LOCALE.str(i) for i in largerExtent ] ARCPY.env.XYDomain = " ".join(largerExtent) #### Create Output Feature Class #### ARCPY.SetProgressor("default", ARCPY.GetIDMessage(84003)) outPath, outName = OS.path.split(outputFC) try: DM.CreateFeatureclass(outPath, outName, "POLYGON", "", ssdo.mFlag, ssdo.zFlag, ssdo.spatialRefString) except: ARCPY.AddIDMessage("ERROR", 210, outputFC) raise SystemExit() #### Add Fields to Output FC #### dataFieldNames = UTILS.getFieldNames(sdFieldNames, outPath) shapeFieldNames = ["SHAPE@"] for fieldName in dataFieldNames: UTILS.addEmptyField(outputFC, fieldName, "DOUBLE") caseIsDate = False if caseField: fcCaseField = ssdo.allFields[caseField] validCaseName = UTILS.validQFieldName(fcCaseField, outPath) caseType = UTILS.convertType[fcCaseField.type] UTILS.addEmptyField(outputFC, validCaseName, caseType) dataFieldNames.append(validCaseName) if caseType.upper() == "DATE": caseIsDate = True #### Write Output #### badCaseRadians = [] allFieldNames = shapeFieldNames + dataFieldNames rows = DA.InsertCursor(outputFC, allFieldNames) for case in self.caseKeys: #### Get Results #### xVal, yVal = self.meanCenter[case] radius = self.sd[case] #### Create Empty Polygon Geomretry #### poly = ARCPY.Array() #### Check for Valid Radius #### radiusZero = UTILS.compareFloat(0.0, radius, rTol = .0000001) radiusNan = NUM.isnan(radius) radiusBool = radiusZero + radiusNan if radiusBool: badRadian = 6 badCase = UTILS.caseValue2Print(case, self.caseIsString) badCaseRadians.append(badCase) else: badRadian = 0 #### Calculate a Point For Each #### #### Degree in Circle Polygon #### for degree in NUM.arange(0, 360): try: radians = NUM.pi / 180.0 * degree pntX = xVal + (radius * NUM.cos(radians)) pntY = yVal + (radius * NUM.sin(radians)) pnt = ARCPY.Point(pntX, pntY, ssdo.defaultZ) poly.add(pnt) except: badRadian += 1 if badRadian == 6: badCase = UTILS.caseValue2Print(case, self.caseIsString) badCaseRadians.append(badCase) break if badRadian < 6: #### Create and Populate New Feature #### poly = ARCPY.Polygon(poly, None, True) rowResult = [poly, xVal, yVal, radius] if caseField: caseValue = case.item() if caseIsDate: caseValue = TUTILS.iso2DateTime(caseValue) rowResult.append(caseValue) rows.insertRow(rowResult) #### Report Bad Cases Due to Geometry (coincident pts) #### nBadRadians = len(badCaseRadians) if nBadRadians: if caseField: badCaseRadians = " ".join(badCaseRadians) ARCPY.AddIDMessage("WARNING", 1011, caseField, badCaseRadians) else: ARCPY.AddIDMessage("ERROR", 978) raise SystemExit() #### Return Extent to Normal if not Projected #### if ssdo.spatialRefType != "Projected": ARCPY.env.XYDomain = None #### Clean Up #### del rows #### Set Attribute #### self.outputFC = outputFC
def output2NewFC(self, outputFC, candidateFields, appendFields = [], fieldOrder = []): """Creates a new feature class with the same shape charcteristics as the source input feature class and appends data to it. INPUTS: outputFC (str): catalogue path to output feature class candidateFields (dict): fieldName = instance of CandidateField appendFields {list, []}: field names in the order you want appended fieldOrder {list, []}: the order with which to write fields """ #### Initial Progressor Bar #### ARCPY.overwriteOutput = True ARCPY.SetProgressor("default", ARCPY.GetIDMessage(84006)) #### Validate Output Workspace #### ERROR.checkOutputPath(outputFC) #### Create Path for Output FC #### outPath, outName = OS.path.split(outputFC) #### Get Output Name for SDE if Necessary #### baseType = UTILS.getBaseWorkspaceType(outPath) if baseType.upper() == 'REMOTEDATABASE': outName = outName.split(".")[-1] self.outputFC = OS.path.join(outPath, outName) #### Assess Whether to Honor Original Field Nullable Flag #### setNullable = UTILS.setToNullable(self.catPath, self.outputFC) #### Add Null Value Flag #### outIsShapeFile = UTILS.isShapeFile(self.outputFC) #### Create Output Field Names to be Appended From Input #### inputFieldNames = ["SHAPE@", self.masterField] appendFieldNames = [] masterIsOID = self.masterField == self.oidName if masterIsOID: appendFieldNames.append("SOURCE_ID") else: master = self.allFields[self.masterField.upper()] returnName = UTILS.returnOutputFieldName(master) appendFieldNames.append(returnName) for fieldName in appendFields: field = self.allFields[fieldName.upper()] returnName = UTILS.returnOutputFieldName(field) inputFieldNames.append(fieldName) appendFieldNames.append(returnName) appendFieldNames = UTILS.createAppendFieldNames(appendFieldNames, outPath) masterOutName = appendFieldNames[0] #### Create Field Mappings for Visible Fields #### outputFieldMaps = ARCPY.FieldMappings() #### Add Input Fields to Output #### for ind, fieldName in enumerate(appendFieldNames): if ind == 0: #### Master Field #### sourceFieldName = self.masterField if masterIsOID: fieldType = "LONG" alias = fieldName setOutNullable = False fieldLength = None fieldPrecision = None else: masterOutField = self.allFields[self.masterField.upper()] fieldType = masterOutField.type alias = masterOutField.baseName setOutNullable = setNullable fieldLength = masterOutField.length fieldPrecision = masterOutField.precision else: #### Append Fields #### sourceFieldName = appendFields[ind-1] outField = self.allFields[sourceFieldName] fieldType = outField.type alias = outField.baseName setOutNullable = setNullable fieldLength = outField.length fieldPrecision = outField.precision #### Create Candidate Field #### outCandidate = CandidateField(fieldName, fieldType, None, alias = alias, precision = fieldPrecision, length = fieldLength) #### Create Output Field Map #### outFieldMap = UTILS.createOutputFieldMap(self.inputFC, sourceFieldName, outFieldCandidate = outCandidate, setNullable = setOutNullable) #### Add Output Field Map to New Field Mapping #### outputFieldMaps.addFieldMap(outFieldMap) #### Do FC2FC Without Extent Env Var #### FC2FC = UTILS.clearExtent(CONV.FeatureClassToFeatureClass) try: FC2FC(self.inputFC, outPath, outName, "", outputFieldMaps) except: ARCPY.AddIDMessage("ERROR", 210, self.outputFC) raise SystemExit() #### Create/Verify Result Field Order #### fieldKeys = candidateFields.keys() fieldKeys.sort() if len(fieldOrder) == len(fieldKeys): fKeySet = set(fieldKeys) fieldOrderSet = set(fieldOrder) if fieldOrderSet == fKeySet: fieldKeys = fieldOrder del fKeySet, fieldOrderSet #### Add Empty Output Analysis Fields #### outputFieldNames = [masterOutName] for fieldInd, fieldName in enumerate(fieldKeys): field = candidateFields[fieldName] field.copy2FC(outputFC) outputFieldNames.append(fieldName) #### Replace NaNs for Shapefiles #### if outIsShapeFile: if field.type != "TEXT": isNaN = NUM.isnan(field.data) if NUM.any(isNaN): field.data[isNaN] = UTILS.shpFileNull[field.type] #### Populate Output Feature Class with Values #### ARCPY.SetProgressor("step", ARCPY.GetIDMessage(84003), 0, self.numObs, 1) outRows = DA.UpdateCursor(self.outputFC, outputFieldNames) for row in outRows: masterID = row[0] if self.master2Order.has_key(masterID): order = self.master2Order[masterID] #### Create Output Row from Input #### resultValues = [masterID] #### Add Result Values #### for fieldName in fieldKeys: field = candidateFields[fieldName] fieldValue = field.data.item(order) resultValues.append(fieldValue) #### Insert Values into Output #### outRows.updateRow(resultValues) else: #### Bad Record #### outRows.deleteRow() ARCPY.SetProgressorPosition() #### Clean Up #### del outRows
def output2NewFC(self, outputFC, candidateFields, appendFields=[], fieldOrder=[]): """Creates a new feature class with the same shape charcteristics as the source input feature class and appends data to it. INPUTS: outputFC (str): catalogue path to output feature class candidateFields (dict): fieldName = instance of CandidateField appendFields {list, []}: field names in the order you want appended fieldOrder {list, []}: the order with which to write fields """ #### Initial Progressor Bar #### ARCPY.overwriteOutput = True ARCPY.SetProgressor("default", ARCPY.GetIDMessage(84006)) #### Validate Output Workspace #### ERROR.checkOutputPath(outputFC) #### Create Path for Output FC #### outPath, outName = OS.path.split(outputFC) #### Get Output Name for SDE if Necessary #### baseType = UTILS.getBaseWorkspaceType(outPath) if baseType.upper() == 'REMOTEDATABASE': outName = outName.split(".")[-1] self.outputFC = OS.path.join(outPath, outName) #### Assess Whether to Honor Original Field Nullable Flag #### setNullable = UTILS.setToNullable(self.catPath, self.outputFC) #### Add Null Value Flag #### outIsShapeFile = UTILS.isShapeFile(self.outputFC) #### Create Output Field Names to be Appended From Input #### inputFieldNames = ["SHAPE@", self.masterField] appendFieldNames = [] masterIsOID = self.masterField == self.oidName if masterIsOID: appendFieldNames.append("SOURCE_ID") else: master = self.allFields[self.masterField.upper()] returnName = UTILS.returnOutputFieldName(master) appendFieldNames.append(returnName) for fieldName in appendFields: field = self.allFields[fieldName.upper()] returnName = UTILS.returnOutputFieldName(field) inputFieldNames.append(fieldName) appendFieldNames.append(returnName) appendFieldNames = UTILS.createAppendFieldNames( appendFieldNames, outPath) masterOutName = appendFieldNames[0] #### Create Field Mappings for Visible Fields #### outputFieldMaps = ARCPY.FieldMappings() #### Add Input Fields to Output #### for ind, fieldName in enumerate(appendFieldNames): if ind == 0: #### Master Field #### sourceFieldName = self.masterField if masterIsOID: fieldType = "LONG" alias = fieldName setOutNullable = False fieldLength = None fieldPrecision = None else: masterOutField = self.allFields[self.masterField.upper()] fieldType = masterOutField.type alias = masterOutField.baseName setOutNullable = setNullable fieldLength = masterOutField.length fieldPrecision = masterOutField.precision else: #### Append Fields #### sourceFieldName = appendFields[ind - 1] outField = self.allFields[sourceFieldName] fieldType = outField.type alias = outField.baseName setOutNullable = setNullable fieldLength = outField.length fieldPrecision = outField.precision #### Create Candidate Field #### outCandidate = CandidateField(fieldName, fieldType, None, alias=alias, precision=fieldPrecision, length=fieldLength) #### Create Output Field Map #### outFieldMap = UTILS.createOutputFieldMap( self.inputFC, sourceFieldName, outFieldCandidate=outCandidate, setNullable=setOutNullable) #### Add Output Field Map to New Field Mapping #### outputFieldMaps.addFieldMap(outFieldMap) #### Do FC2FC Without Extent Env Var #### FC2FC = UTILS.clearExtent(CONV.FeatureClassToFeatureClass) try: FC2FC(self.inputFC, outPath, outName, "", outputFieldMaps) except: ARCPY.AddIDMessage("ERROR", 210, self.outputFC) raise SystemExit() #### Create/Verify Result Field Order #### fieldKeys = candidateFields.keys() fieldKeys.sort() if len(fieldOrder) == len(fieldKeys): fKeySet = set(fieldKeys) fieldOrderSet = set(fieldOrder) if fieldOrderSet == fKeySet: fieldKeys = fieldOrder del fKeySet, fieldOrderSet #### Add Empty Output Analysis Fields #### outputFieldNames = [masterOutName] for fieldInd, fieldName in enumerate(fieldKeys): field = candidateFields[fieldName] field.copy2FC(outputFC) outputFieldNames.append(fieldName) #### Replace NaNs for Shapefiles #### if outIsShapeFile: if field.type != "TEXT": isNaN = NUM.isnan(field.data) if NUM.any(isNaN): field.data[isNaN] = UTILS.shpFileNull[field.type] #### Populate Output Feature Class with Values #### ARCPY.SetProgressor("step", ARCPY.GetIDMessage(84003), 0, self.numObs, 1) outRows = DA.UpdateCursor(self.outputFC, outputFieldNames) for row in outRows: masterID = row[0] if self.master2Order.has_key(masterID): order = self.master2Order[masterID] #### Create Output Row from Input #### resultValues = [masterID] #### Add Result Values #### for fieldName in fieldKeys: field = candidateFields[fieldName] fieldValue = field.data.item(order) resultValues.append(fieldValue) #### Insert Values into Output #### outRows.updateRow(resultValues) else: #### Bad Record #### outRows.deleteRow() ARCPY.SetProgressorPosition() #### Clean Up #### del outRows
def collectEvents(ssdo, outputFC): """This utility converts event data into weighted point data by dissolving all coincident points into unique points with a new count field that contains the number of original features at that location. INPUTS: inputFC (str): path to the input feature class outputFC (str): path to the input feature class """ #### Set Default Progressor for Neigborhood Structure #### ARCPY.SetProgressor("default", ARCPY.GetIDMessage(84143)) #### Validate Output Workspace #### ERROR.checkOutputPath(outputFC) #### True Centroid Warning For Non-Point FCs #### if ssdo.shapeType.upper() != "POINT": ARCPY.AddIDMessage("WARNING", 1021) #### Create GA Data Structure #### gaTable, gaInfo = WU.gaTable(ssdo.inputFC, spatRef = ssdo.spatialRefString) #### Assure Enough Observations #### cnt = UTILS.getCount(ssdo.inputFC) ERROR.errorNumberOfObs(cnt, minNumObs = 4) N = gaInfo[0] ERROR.errorNumberOfObs(N, minNumObs = 4) #### Process Any Bad Records Encountered #### numBadRecs = cnt - N if numBadRecs: badRecs = WU.parseGAWarnings(gaTable.warnings) if not ssdo.silentWarnings: ERROR.reportBadRecords(cnt, numBadRecs, badRecs, label = ssdo.oidName) #### Create k-Nearest Neighbor Search Type #### gaSearch = GAPY.ga_nsearch(gaTable) gaSearch.init_nearest(0.0, 0, "euclidean") #### Create Output Feature Class #### outPath, outName = OS.path.split(outputFC) try: DM.CreateFeatureclass(outPath, outName, "POINT", "", ssdo.mFlag, ssdo.zFlag, ssdo.spatialRefString) except: ARCPY.AddIDMessage("ERROR", 210, outputFC) raise SystemExit() #### Add Count Field #### countFieldNameOut = ARCPY.ValidateFieldName(countFieldName, outPath) UTILS.addEmptyField(outputFC, countFieldNameOut, "LONG") fieldList = ["SHAPE@", countFieldNameOut] #### Set Insert Cursor #### rowsOut = DA.InsertCursor(outputFC, fieldList) #### Set Progressor for Calculation #### ARCPY.SetProgressor("step", ARCPY.GetIDMessage(84007), 0, N, 1) #### ID List to Search #### rowsIN = range(N) maxCount = 0 numUnique = 0 for row in rowsIN: #### Get Row Coords #### rowInfo = gaTable[row] x0, y0 = rowInfo[1] count = 1 #### Search For Exact Coord Match #### gaSearch.search_by_idx(row) for nh in gaSearch: count += 1 rowsIN.remove(nh.idx) ARCPY.SetProgressorPosition() #### Keep Track of Max Count #### maxCount = max([count, maxCount]) #### Create Output Point #### pnt = (x0, y0, ssdo.defaultZ) #### Create and Populate New Feature #### rowResult = [pnt, count] rowsOut.insertRow(rowResult) numUnique += 1 ARCPY.SetProgressorPosition() #### Clean Up #### del rowsOut, gaTable return countFieldNameOut, maxCount, N, numUnique
def createOutputShapes(self, outputFC): #### Shorthand Attributes #### ssdoBase = self.ssdoBase ssdoCand = self.ssdoCand #### Validate Output Workspace #### ARCPY.overwriteOutput = True ERROR.checkOutputPath(outputFC) #### Create Output Feature Class #### ARCPY.SetProgressor("default", ARCPY.GetIDMessage(84003)) outPath, outName = OS.path.split(outputFC) tempFC = UTILS.returnScratchName("TempSS_FC", fileType = "FEATURECLASS", scratchWS = outPath) outTempPath, outTempName = OS.path.split(tempFC) try: DM.CreateFeatureclass(outTempPath, outTempName, ssdoBase.shapeType, "", ssdoBase.mFlag, ssdoBase.zFlag, ssdoBase.spatialRefString) except: ARCPY.AddIDMessage("ERROR", 210, outputFC) raise SystemExit() #### Add Null Value Flag #### outIsShapeFile = UTILS.isShapeFile(outputFC) setNullable = outIsShapeFile == False #### Make Feature Layer and Select Result OIDs/Shapes #### featureCount = ssdoBase.numObs + ssdoCand.numObs ARCPY.SetProgressor("step", ARCPY.GetIDMessage(84003), 0, featureCount, 1) #### Add Shape/ID Field Names #### matchID, candID = outputIDFieldNames outFieldNames = ["SHAPE@"] + outputIDFieldNames inFieldNames = ["OID@", "SHAPE@"] UTILS.addEmptyField(tempFC, matchID, "LONG", nullable = True) UTILS.addEmptyField(tempFC, candID, "LONG", nullable = True) #### Add Append Fields #### lenAppend = len(self.appendFields) appendIsDate = [] in2OutFieldNames = {} if lenAppend: for fieldName in self.appendFields: fcField = ssdoCand.allFields[fieldName] fieldType = UTILS.convertType[fcField.type] fieldOutName = UTILS.validQFieldName(fcField, outPath) in2OutFieldNames[fieldName] = fieldOutName if fieldType == "DATE": appendIsDate.append(fieldName) UTILS.addEmptyField(tempFC, fieldOutName, fieldType, alias = fcField.alias) outFieldNames.append(fieldOutName) #### Add Analysis Fields #### for fieldName in self.fieldNames: fcField = ssdoBase.allFields[fieldName] fieldType = UTILS.convertType[fcField.type] fieldOutName = UTILS.validQFieldName(fcField, outPath) in2OutFieldNames[fieldName] = fieldOutName UTILS.addEmptyField(tempFC, fieldOutName, fieldType, alias = fcField.alias) outFieldNames.append(fieldOutName) dataFieldNames = matchFieldInfo[self.similarType] dataFieldInfo = outputFieldInfo[self.matchMethod] baseValues = [] for fieldName in dataFieldNames: outAlias, outType, baseValue = dataFieldInfo[fieldName] UTILS.addEmptyField(tempFC, fieldName, outType, alias = outAlias, nullable = setNullable) outFieldNames.append(fieldName) baseValues.append(baseValue) #### Get Insert Cursor #### baseRows = DA.SearchCursor(ssdoBase.inputFC, inFieldNames) candRows = DA.SearchCursor(ssdoCand.inputFC, inFieldNames) rows = DA.InsertCursor(tempFC, outFieldNames) #### Set Base Data #### useShapeNull = outIsShapeFile if useShapeNull: nullIntValue = UTILS.shpFileNull['LONG'] else: nullIntValue = None #### Set Base Null For Append #### appendNull = {} for fieldName in self.appendFields: if fieldName not in ssdoBase.fields: if useShapeNull: outType = ssdoCand.fields[fieldName].type outNullValue = UTILS.shpFileNull[outType] else: outNullValue = None appendNull[fieldName] = outNullValue #### Add Base Data #### for masterID, shp in baseRows: orderID = ssdoBase.master2Order[masterID] #### Insert Shape, Match_ID and NULL (Cand_ID) #### rowRes = [shp, masterID, nullIntValue] #### Add Append Fields #### for fieldName in self.appendFields: if fieldName in appendNull: rowRes.append(appendNull[fieldName]) else: value = ssdoBase.fields[fieldName].data[orderID] if fieldName in appendIsDate: value = TUTILS.iso2DateTime(value) rowRes.append(value) #### Add Analysis Fields #### for fieldName in self.fieldNames: rowRes.append(ssdoBase.fields[fieldName].data[orderID]) #### Add Null Base Values #### rowRes += baseValues rows.insertRow(rowRes) ARCPY.SetProgressorPosition() del baseRows #### First Add Similar Results #### for masterID, shp in candRows: orderID = ssdoCand.master2Order[masterID] indTop = NUM.where(self.topIDs == orderID)[0] indBot = NUM.where(self.botIDs == orderID)[0] if self.similarType in ['MOST_SIMILAR', 'BOTH'] and len(indTop): ind = indTop[0] #### Insert Shape, NULL (Match_ID) and Cand_ID #### rowRes = [shp, nullIntValue, masterID] #### Add Append Fields #### for fieldName in self.appendFields: rowRes.append(ssdoCand.fields[fieldName].data[orderID]) #### Add Analysis Fields #### for fieldName in self.fieldNames: rowRes.append(ssdoCand.fields[fieldName].data[orderID]) #### Add Results #### rank = ind + 1 ss = self.totalDist[orderID] if self.similarType == 'BOTH': rowRes += [rank, nullIntValue, ss, rank] else: rowRes += [rank, ss, rank] rows.insertRow(rowRes) if self.similarType in ['LEAST_SIMILAR', 'BOTH'] and len(indBot): ind = indBot[0] #### Insert Shape, NULL (Match_ID) and Cand_ID #### rowRes = [shp, nullIntValue, masterID] #### Add Append Fields #### for fieldName in self.appendFields: rowRes.append(ssdoCand.fields[fieldName].data[orderID]) #### Add Analysis Fields #### for fieldName in self.fieldNames: rowRes.append(ssdoCand.fields[fieldName].data[orderID]) #### Add Results #### rank = ind + 1 labRank = rank * -1 ss = self.totalDist[orderID] if self.similarType == 'BOTH': rowRes += [nullIntValue, rank, ss, labRank] else: rowRes += [rank, ss, labRank] rows.insertRow(rowRes) ARCPY.SetProgressorPosition() del candRows del rows #### Do Final Sort #### if self.matchMethod == 'ATTRIBUTE_PROFILES': if self.similarType == 'MOST_SIMILAR': sortString = "SIMINDEX DESCENDING;SIMRANK DESCENDING" else: sortString = "SIMINDEX DESCENDING" else: if self.similarType == 'MOST_SIMILAR': sortString = "SIMINDEX ASCENDING;SIMRANK ASCENDING" else: sortString = "SIMINDEX ASCENDING" DM.Sort(tempFC, outputFC, sortString, "UR") #### Clean Up #### DM.Delete(tempFC) #### Symbology #### params = ARCPY.gp.GetParameterInfo() try: renderType = UTILS.renderType[self.ssdoBase.shapeType.upper()] renderKey = (self.similarType, renderType) renderLayerFile = outputRenderInfo[renderKey] templateDir = OS.path.dirname(OS.path.dirname(SYS.argv[0])) fullRLF = OS.path.join(templateDir, "Templates", "Layers", renderLayerFile) params[2].Symbology = fullRLF except: ARCPY.AddIDMessage("WARNING", 973)
def createOutput(self, outputFC): """Creates an Output Feature Class with the Mean Centers. INPUTS: outputFC (str): path to the output feature class """ #### Validate Output Workspace #### ERROR.checkOutputPath(outputFC) #### Shorthand Attributes #### ssdo = self.ssdo caseField = self.caseField dimField = self.dimField #### Create Output Feature Class #### ARCPY.SetProgressor("default", ARCPY.GetIDMessage(84003)) outPath, outName = OS.path.split(outputFC) try: DM.CreateFeatureclass(outPath, outName, "POINT", "", ssdo.mFlag, ssdo.zFlag, ssdo.spatialRefString) except: ARCPY.AddIDMessage("ERROR", 210, outputFC) raise SystemExit() #### Add Field Names #### fn = UTILS.getFieldNames(mcFieldNames, outPath) xFieldName, yFieldName, zFieldName = fn shapeFieldNames = ["SHAPE@"] dataFieldNames = [xFieldName, yFieldName] if ssdo.zBool: dataFieldNames.append(zFieldName) for fieldName in dataFieldNames: UTILS.addEmptyField(outputFC, fieldName, "DOUBLE") caseIsDate = False if caseField: fcCaseField = ssdo.allFields[caseField] validCaseName = UTILS.validQFieldName(fcCaseField, outPath) caseType = UTILS.convertType[fcCaseField.type] UTILS.addEmptyField(outputFC, validCaseName, caseType) dataFieldNames.append(validCaseName) if caseType.upper() == "DATE": caseIsDate = True if dimField: fcDimField = ssdo.allFields[dimField] validDimName = UTILS.validQFieldName(fcDimField, outPath) if caseField: if validCaseName == validDimName: validDimName = ARCPY.GetIDMessage(84199) UTILS.addEmptyField(outputFC, validDimName, "DOUBLE") dataFieldNames.append(validDimName) #### Write Output #### allFieldNames = shapeFieldNames + dataFieldNames rows = DA.InsertCursor(outputFC, allFieldNames) for case in self.caseKeys: #### Mean Centers #### meanX, meanY, meanZ = self.meanCenter[case] pnt = (meanX, meanY, meanZ) if ssdo.zBool: rowResult = [pnt, meanX, meanY, meanZ] else: rowResult = [pnt, meanX, meanY] #### Set Attribute Fields #### if caseField: caseValue = case.item() if caseIsDate: caseValue = TUTILS.iso2DateTime(caseValue) rowResult.append(caseValue) if dimField: meanDim = self.dimCenter[case] rowResult.append(meanDim) rows.insertRow(rowResult) #### Clean Up #### del rows #### Set Attribute #### self.outputFC = outputFC
def createOutput(self, outputFC): """Creates an Output Feature Class with the Standard Distances. INPUTS: outputFC (str): path to the output feature class """ #### Validate Output Workspace #### ERROR.checkOutputPath(outputFC) #### Shorthand Attributes #### ssdo = self.ssdo caseField = self.caseField #### Increase Extent if not Projected #### if ssdo.spatialRefType != "Projected": seValues = self.se.values() if len(seValues): maxSE = NUM.array([i[0:2] for i in seValues]).max() largerExtent = UTILS.increaseExtentByConstant(ssdo.extent, constant=maxSE) largerExtent = [LOCALE.str(i) for i in largerExtent] ARCPY.env.XYDomain = " ".join(largerExtent) #### Create Output Feature Class #### ARCPY.SetProgressor("default", ARCPY.GetIDMessage(84003)) outPath, outName = OS.path.split(outputFC) try: DM.CreateFeatureclass(outPath, outName, "POLYGON", "", ssdo.mFlag, ssdo.zFlag, ssdo.spatialRefString) except: ARCPY.AddIDMessage("ERROR", 210, outputFC) raise SystemExit() #### Add Fields to Output FC #### dataFieldNames = UTILS.getFieldNames(seFieldNames, outPath) shapeFieldNames = ["SHAPE@"] for fieldName in dataFieldNames: UTILS.addEmptyField(outputFC, fieldName, "DOUBLE") caseIsDate = False if caseField: fcCaseField = ssdo.allFields[caseField] validCaseName = UTILS.validQFieldName(fcCaseField, outPath) caseType = UTILS.convertType[fcCaseField.type] UTILS.addEmptyField(outputFC, validCaseName, caseType) dataFieldNames.append(validCaseName) if caseType.upper() == "DATE": caseIsDate = True #### Write Output #### badCaseRadians = [] allFieldNames = shapeFieldNames + dataFieldNames rows = DA.InsertCursor(outputFC, allFieldNames) for case in self.caseKeys: #### Get Results #### xVal, yVal = self.meanCenter[case] seX, seY, degreeRotation, radianR1, radianR2 = self.se[case] seX2 = seX**2.0 seY2 = seY**2.0 #### Create Empty Polygon Geomretry #### poly = ARCPY.Array() #### Check for Valid Radius #### seXZero = UTILS.compareFloat(0.0, seX, rTol=.0000001) seXNan = NUM.isnan(seX) seXBool = seXZero + seXNan seYZero = UTILS.compareFloat(0.0, seY, rTol=.0000001) seYNan = NUM.isnan(seY) seYBool = seYZero + seYNan if seXBool or seYBool: badRadian = 6 badCase = UTILS.caseValue2Print(case, self.caseIsString) badCaseRadians.append(badCase) else: badRadian = 0 cosRadian = NUM.cos(radianR1) sinRadian = NUM.sin(radianR1) #### Calculate a Point For Each #### #### Degree in Ellipse Polygon #### for degree in NUM.arange(0, 360): try: radians = UTILS.convert2Radians(degree) tanVal2 = NUM.tan(radians)**2.0 dX = MATH.sqrt( (seX2 * seY2) / (seY2 + (seX2 * tanVal2))) dY = MATH.sqrt((seY2 * (seX2 - dX**2.0)) / seX2) #### Adjust for Quadrant #### if 90 <= degree < 180: dX = -dX elif 180 <= degree < 270: dX = -dX dY = -dY elif degree >= 270: dY = -dY #### Rotate X and Y #### dXr = dX * cosRadian - dY * sinRadian dYr = dX * sinRadian + dY * cosRadian #### Create Point Shifted to #### #### Ellipse Centroid #### pntX = dXr + xVal pntY = dYr + yVal pnt = ARCPY.Point(pntX, pntY, ssdo.defaultZ) poly.add(pnt) except: badRadian += 1 if badRadian == 6: badCase = UTILS.caseValue2Print( case, self.caseIsString) badCaseRadians.append(badCase) break if badRadian < 6: #### Create and Populate New Feature #### poly = ARCPY.Polygon(poly, None, True) rowResult = [poly, xVal, yVal, seX, seY, radianR2] if caseField: caseValue = case.item() if caseIsDate: caseValue = TUTILS.iso2DateTime(caseValue) rowResult.append(caseValue) rows.insertRow(rowResult) #### Report Bad Cases Due to Geometry (coincident pts) #### nBadRadians = len(badCaseRadians) if nBadRadians: if caseField: badCaseRadians = " ".join(badCaseRadians) ARCPY.AddIDMessage("WARNING", 1011, caseField, badCaseRadians) else: ARCPY.AddIDMessage("ERROR", 978) raise SystemExit() #### Return Extent to Normal if not Projected #### if ssdo.spatialRefType != "Projected": ARCPY.env.XYDomain = "" #### Clean Up #### del rows #### Set Attribute #### self.outputFC = outputFC
def stCollectByKNN(ssdo, timeField, outputFC, inSpan, inDistance): """ This method applied Jacquez Space-Time K-NN to convert event data into weighted point data by dissolving all coincident points in space and time into unique points with a new count field that contains the number of original features at that location and time span. INPUTS: ssdo (obj): SSDataObject from input timeField (str): Date/Time field name in input feature outputFC (str): path to the output feature class inSpan (int): value of temporal units within the same time bin inDistance (int): value of spatial units considered as spatial neighbors OUTPUTS: Create new collected point feature """ #### Read raw time data #### timeData = ssdo.fields[timeField].data #### Convert temporal unit #### time = NUM.array(timeData, dtype='datetime64[s]').astype('datetime64[D]') #### Find Start Time #### startTime = time.min() #### Create Bin for Space and Time #### timeBin = (time - startTime) / inSpan numObs = ssdo.numObs #### Create Sudo-fid to Find K-NN in Space and Time fid = [i for i in xrange(numObs)] #### Validate Output Workspace #### ERROR.checkOutputPath(outputFC) #### True Centroid Warning For Non-Point FCs #### if ssdo.shapeType.upper() != "POINT": ARCPY / AddIDMessage("WARNING", 1021) #### Create GA Data Structure #### gaTable, gaInfo = WU.gaTable(ssdo.inputFC, spatRef=ssdo.spatialRefString) #### Assure Enough Observations #### cnt = UTILS.getCount(ssdo.inputFC) ERROR.errorNumberOfObs(cnt, minNumObs=4) N = gaInfo[0] ERROR.errorNumberOfObs(N, minNumObs=4) #### Process Any Bad Records Encountered #### numBadRecs = cnt - N if numBadRecs: badRecs = WU.parseGAWarnings(gaTable.warnings) if not ssdo.silentWarnings: ERROR.reportBadRecords(cnt, numBadRecs, badRecs, label=ssdo.oidName) #### Create Output Feature Class #### outPath, outName = OS.path.split(outputFC) try: DM.CreateFeatureclass(outPath, outName, "POINT", "", ssdo.mFlag, ssdo.zFlag, ssdo.spatialRefString) except: ARCPY.AddIDMessage("ERROR", 210, outputFC) raise SystemExit() #### Create k-Nearest Neighbor Search Type #### gaSearch = GAPY.ga_nsearch(gaTable) gaSearch.init_nearest(inDistance, 0, "euclidean") #### Add Count Field #### countFieldNameOut = ARCPY.ValidateFieldName(countFieldName, outPath) timeFieldNameOut = ARCPY.ValidateFieldName(timeFieldName, outPath) UTILS.addEmptyField(outputFC, countFieldNameOut, "LONG") UTILS.addEmptyField(outputFC, timeFieldNameOut, "DATE") fieldList = ["SHAPE@", countFieldNameOut, timeFieldNameOut] #### Set Insert Cursor #### rowsOut = DA.InsertCursor(outputFC, fieldList) #### Detect S-T K-NN by Space and Time Bin #### duplicateList = [] for record in fid: kNNList = [record] if record not in duplicateList: for pair in fid: if pair != record: gaSearch.search_by_idx(record) for nh in gaSearch: if timeBin[record] == timeBin[pair]: kNNList.append(nh.idx) duplicateList.append(nh.idx) #### Create and Populate New Feature #### kNNList = list(set(kNNList)) count = len(kNNList) dt = time[record] x0 = ssdo.xyCoords[kNNList, 0].mean() y0 = ssdo.xyCoords[kNNList, 1].mean() pnt = (x0, y0, ssdo.defaultZ) rowResult = [pnt, count, dt] rowsOut.insertRow(rowResult) ARCPY.SetProgressorPosition() #### Clean Up #### del rowsOut, timeBin, kNNList, duplicateList return countFieldNameOut
def createOutput(self, outputFC): """Creates an Output Feature Class with the Standard Distances. INPUTS: outputFC (str): path to the output feature class """ #### Validate Output Workspace #### ERROR.checkOutputPath(outputFC) #### Shorthand Attributes #### ssdo = self.ssdo caseField = self.caseField #### Increase Extent if not Projected #### if ssdo.spatialRefType != "Projected": seValues = self.se.values() if len(seValues): maxSE = NUM.array([ i[0:2] for i in seValues ]).max() largerExtent = UTILS.increaseExtentByConstant(ssdo.extent, constant = maxSE) largerExtent = [ LOCALE.str(i) for i in largerExtent ] ARCPY.env.XYDomain = " ".join(largerExtent) #### Create Output Feature Class #### ARCPY.SetProgressor("default", ARCPY.GetIDMessage(84003)) outPath, outName = OS.path.split(outputFC) try: DM.CreateFeatureclass(outPath, outName, "POLYGON", "", ssdo.mFlag, ssdo.zFlag, ssdo.spatialRefString) except: ARCPY.AddIDMessage("ERROR", 210, outputFC) raise SystemExit() #### Add Fields to Output FC #### dataFieldNames = UTILS.getFieldNames(seFieldNames, outPath) shapeFieldNames = ["SHAPE@"] for fieldName in dataFieldNames: UTILS.addEmptyField(outputFC, fieldName, "DOUBLE") caseIsDate = False if caseField: fcCaseField = ssdo.allFields[caseField] validCaseName = UTILS.validQFieldName(fcCaseField, outPath) caseType = UTILS.convertType[fcCaseField.type] UTILS.addEmptyField(outputFC, validCaseName, caseType) dataFieldNames.append(validCaseName) if caseType.upper() == "DATE": caseIsDate = True #### Write Output #### badCaseRadians = [] allFieldNames = shapeFieldNames + dataFieldNames rows = DA.InsertCursor(outputFC, allFieldNames) for case in self.caseKeys: #### Get Results #### xVal, yVal = self.meanCenter[case] seX, seY, degreeRotation, radianR1, radianR2 = self.se[case] seX2 = seX**2.0 seY2 = seY**2.0 #### Create Empty Polygon Geomretry #### poly = ARCPY.Array() #### Check for Valid Radius #### seXZero = UTILS.compareFloat(0.0, seX, rTol = .0000001) seXNan = NUM.isnan(seX) seXBool = seXZero + seXNan seYZero = UTILS.compareFloat(0.0, seY, rTol = .0000001) seYNan = NUM.isnan(seY) seYBool = seYZero + seYNan if seXBool or seYBool: badRadian = 6 badCase = UTILS.caseValue2Print(case, self.caseIsString) badCaseRadians.append(badCase) else: badRadian = 0 cosRadian = NUM.cos(radianR1) sinRadian = NUM.sin(radianR1) #### Calculate a Point For Each #### #### Degree in Ellipse Polygon #### for degree in NUM.arange(0, 360): try: radians = UTILS.convert2Radians(degree) tanVal2 = NUM.tan(radians)**2.0 dX = MATH.sqrt((seX2 * seY2) / (seY2 + (seX2 * tanVal2))) dY = MATH.sqrt((seY2 * (seX2 - dX**2.0)) / seX2) #### Adjust for Quadrant #### if 90 <= degree < 180: dX = -dX elif 180 <= degree < 270: dX = -dX dY = -dY elif degree >= 270: dY = -dY #### Rotate X and Y #### dXr = dX * cosRadian - dY * sinRadian dYr = dX * sinRadian + dY * cosRadian #### Create Point Shifted to #### #### Ellipse Centroid #### pntX = dXr + xVal pntY = dYr + yVal pnt = ARCPY.Point(pntX, pntY, ssdo.defaultZ) poly.add(pnt) except: badRadian += 1 if badRadian == 6: badCase = UTILS.caseValue2Print(case, self.caseIsString) badCaseRadians.append(badCase) break if badRadian < 6: #### Create and Populate New Feature #### poly = ARCPY.Polygon(poly, None, True) rowResult = [poly, xVal, yVal, seX, seY, radianR2] if caseField: caseValue = case.item() if caseIsDate: caseValue = TUTILS.iso2DateTime(caseValue) rowResult.append(caseValue) rows.insertRow(rowResult) #### Report Bad Cases Due to Geometry (coincident pts) #### nBadRadians = len(badCaseRadians) if nBadRadians: if caseField: badCaseRadians = " ".join(badCaseRadians) ARCPY.AddIDMessage("WARNING", 1011, caseField, badCaseRadians) else: ARCPY.AddIDMessage("ERROR", 978) raise SystemExit() #### Return Extent to Normal if not Projected #### if ssdo.spatialRefType != "Projected": ARCPY.env.XYDomain = "" #### Clean Up #### del rows #### Set Attribute #### self.outputFC = outputFC
def stCollectByKNN(ssdo, timeField, outputFC, inSpan, inDistance): """ This method applied Jacquez Space-Time K-NN to convert event data into weighted point data by dissolving all coincident points in space and time into unique points with a new count field that contains the number of original features at that location and time span. INPUTS: ssdo (obj): SSDataObject from input timeField (str): Date/Time field name in input feature outputFC (str): path to the output feature class inSpan (int): value of temporal units within the same time bin inDistance (int): value of spatial units considered as spatial neighbors OUTPUTS: Create new collected point feature """ #### Read raw time data #### timeData = ssdo.fields[timeField].data #### Convert temporal unit #### time = NUM.array(timeData, dtype = 'datetime64[s]').astype('datetime64[D]') #### Find Start Time #### startTime = time.min() #### Create Bin for Space and Time #### timeBin = (time - startTime) / inSpan numObs = ssdo.numObs #### Create Sudo-fid to Find K-NN in Space and Time fid = [i for i in xrange(numObs)] #### Validate Output Workspace #### ERROR.checkOutputPath(outputFC) #### True Centroid Warning For Non-Point FCs #### if ssdo.shapeType.upper() != "POINT": ARCPY/AddIDMessage("WARNING", 1021) #### Create GA Data Structure #### gaTable, gaInfo = WU.gaTable(ssdo.inputFC, spatRef = ssdo.spatialRefString) #### Assure Enough Observations #### cnt = UTILS.getCount(ssdo.inputFC) ERROR.errorNumberOfObs(cnt, minNumObs = 4) N = gaInfo[0] ERROR.errorNumberOfObs(N, minNumObs = 4) #### Process Any Bad Records Encountered #### numBadRecs = cnt -N if numBadRecs: badRecs = WU.parseGAWarnings(gaTable.warnings) if not ssdo.silentWarnings: ERROR.reportBadRecords(cnt, numBadRecs, badRecs, label = ssdo.oidName) #### Create Output Feature Class #### outPath, outName = OS.path.split(outputFC) try: DM.CreateFeatureclass(outPath, outName, "POINT", "", ssdo.mFlag, ssdo.zFlag, ssdo.spatialRefString) except: ARCPY.AddIDMessage("ERROR", 210, outputFC) raise SystemExit() #### Create k-Nearest Neighbor Search Type #### gaSearch = GAPY.ga_nsearch(gaTable) gaSearch.init_nearest(inDistance, 0, "euclidean") #### Add Count Field #### countFieldNameOut = ARCPY.ValidateFieldName(countFieldName, outPath) timeFieldNameOut = ARCPY.ValidateFieldName(timeFieldName, outPath) UTILS.addEmptyField(outputFC, countFieldNameOut, "LONG") UTILS.addEmptyField(outputFC, timeFieldNameOut, "DATE") fieldList = ["SHAPE@", countFieldNameOut, timeFieldNameOut] #### Set Insert Cursor #### rowsOut = DA.InsertCursor(outputFC, fieldList) #### Detect S-T K-NN by Space and Time Bin #### duplicateList = [] for record in fid: kNNList = [record] if record not in duplicateList: for pair in fid: if pair != record : gaSearch.search_by_idx(record) for nh in gaSearch: if timeBin[record] == timeBin[pair]: kNNList.append(nh.idx) duplicateList.append(nh.idx) #### Create and Populate New Feature #### kNNList = list(set(kNNList)) count = len(kNNList) dt = time[record] x0 = ssdo.xyCoords[kNNList, 0].mean() y0 = ssdo.xyCoords[kNNList, 1].mean() pnt =(x0, y0, ssdo.defaultZ) rowResult = [pnt, count, dt] rowsOut.insertRow(rowResult) ARCPY.SetProgressorPosition() #### Clean Up #### del rowsOut, timeBin, kNNList, duplicateList return countFieldNameOut
def createOutput(self, outputFC): """Creates an Output Feature Class with the Directional Mean Results. INPUTS: outputFC (str): path to the output feature class """ #### Validate Output Workspace #### ERROR.checkOutputPath(outputFC) #### Shorthand Attributes #### ssdo = self.ssdo caseField = self.caseField #### Create Output Feature Class #### ARCPY.SetProgressor("default", ARCPY.GetIDMessage(84003)) outPath, outName = OS.path.split(outputFC) try: DM.CreateFeatureclass(outPath, outName, "POLYLINE", "", ssdo.mFlag, ssdo.zFlag, ssdo.spatialRefString) except: ARCPY.AddIDMessage("ERROR", 210, outputFC) raise SystemExit() #### Add Fields to Output FC #### dataFieldNames = UTILS.getFieldNames(lmFieldNames, outPath) shapeFieldNames = ["SHAPE@"] for fieldName in dataFieldNames: UTILS.addEmptyField(outputFC, fieldName, "DOUBLE") caseIsDate = False if caseField: fcCaseField = ssdo.allFields[caseField] validCaseName = UTILS.validQFieldName(fcCaseField, outPath) caseType = UTILS.convertType[fcCaseField.type] UTILS.addEmptyField(outputFC, validCaseName, caseType) dataFieldNames.append(validCaseName) if caseType.upper() == "DATE": caseIsDate = True #### Populate Output Feature Class #### allFieldNames = shapeFieldNames + dataFieldNames rows = DA.InsertCursor(outputFC, allFieldNames) for case in self.caseKeys: #### Get Results #### start, end, length, rAngle, dAngle, circVar = self.dm[case] meanX, meanY = self.meanCenter[case] dirMean = 360. - dAngle + 90. if not dirMean < 360: dirMean = dirMean - 360. #### Create Start and End Points #### x0, y0 = start startPoint = ARCPY.Point(x0, y0, ssdo.defaultZ) x1, y1 = end endPoint = ARCPY.Point(x1, y1, ssdo.defaultZ) #### Create And Populate Line Array #### line = ARCPY.Array() line.add(startPoint) line.add(endPoint) line = ARCPY.Polyline(line, None, True) #### Create and Populate New Line Feature #### rowResult = [line, dAngle, dirMean, circVar, meanX, meanY, length] if caseField: caseValue = case if caseIsDate: caseValue = TUTILS.iso2DateTime(caseValue) rowResult.append(caseValue) rows.insertRow(rowResult) #### Clean Up #### del rows #### Set Attribute #### self.outputFC = outputFC #### Set the Default Symbology #### params = ARCPY.gp.GetParameterInfo() if self.orientationOnly: renderLayerFile = "LinearMeanTwoWay.lyr" else: renderLayerFile = "LinearMeanOneWay.lyr" templateDir = OS.path.dirname(OS.path.dirname(SYS.argv[0])) fullRLF = OS.path.join(templateDir, "Templates", "Layers", renderLayerFile) params[1].Symbology = fullRLF
def collectEvents(ssdo, outputFC): """This utility converts event data into weighted point data by dissolving all coincident points into unique points with a new count field that contains the number of original features at that location. INPUTS: inputFC (str): path to the input feature class outputFC (str): path to the input feature class """ #### Set Default Progressor for Neigborhood Structure #### ARCPY.SetProgressor("default", ARCPY.GetIDMessage(84143)) #### Validate Output Workspace #### ERROR.checkOutputPath(outputFC) #### True Centroid Warning For Non-Point FCs #### if ssdo.shapeType.upper() != "POINT": ARCPY.AddIDMessage("WARNING", 1021) #### Create GA Data Structure #### gaTable, gaInfo = WU.gaTable(ssdo.inputFC, spatRef=ssdo.spatialRefString) #### Assure Enough Observations #### cnt = UTILS.getCount(ssdo.inputFC) ERROR.errorNumberOfObs(cnt, minNumObs=4) N = gaInfo[0] ERROR.errorNumberOfObs(N, minNumObs=4) #### Process Any Bad Records Encountered #### numBadRecs = cnt - N if numBadRecs: badRecs = WU.parseGAWarnings(gaTable.warnings) if not ssdo.silentWarnings: ERROR.reportBadRecords(cnt, numBadRecs, badRecs, label=ssdo.oidName) #### Create k-Nearest Neighbor Search Type #### gaSearch = GAPY.ga_nsearch(gaTable) gaSearch.init_nearest(0.0, 0, "euclidean") #### Create Output Feature Class #### outPath, outName = OS.path.split(outputFC) try: DM.CreateFeatureclass(outPath, outName, "POINT", "", ssdo.mFlag, ssdo.zFlag, ssdo.spatialRefString) except: ARCPY.AddIDMessage("ERROR", 210, outputFC) raise SystemExit() #### Add Count Field #### countFieldNameOut = ARCPY.ValidateFieldName(countFieldName, outPath) UTILS.addEmptyField(outputFC, countFieldNameOut, "LONG") fieldList = ["SHAPE@", countFieldNameOut] #### Set Insert Cursor #### rowsOut = DA.InsertCursor(outputFC, fieldList) #### Set Progressor for Calculation #### ARCPY.SetProgressor("step", ARCPY.GetIDMessage(84007), 0, N, 1) #### ID List to Search #### rowsIN = range(N) maxCount = 0 numUnique = 0 for row in rowsIN: #### Get Row Coords #### rowInfo = gaTable[row] x0, y0 = rowInfo[1] count = 1 #### Search For Exact Coord Match #### gaSearch.search_by_idx(row) for nh in gaSearch: count += 1 rowsIN.remove(nh.idx) ARCPY.SetProgressorPosition() #### Keep Track of Max Count #### maxCount = max([count, maxCount]) #### Create Output Point #### pnt = (x0, y0, ssdo.defaultZ) #### Create and Populate New Feature #### rowResult = [pnt, count] rowsOut.insertRow(rowResult) numUnique += 1 ARCPY.SetProgressorPosition() #### Clean Up #### del rowsOut, gaTable return countFieldNameOut, maxCount, N, numUnique
def createOutput(self, outputFC): """Creates an Output Feature Class with the Standard Distances. INPUTS: outputFC (str): path to the output feature class """ #### Validate Output Workspace #### ERROR.checkOutputPath(outputFC) #### Shorthand Attributes #### ssdo = self.ssdo caseField = self.caseField #### Increase Extent if not Projected #### if ssdo.spatialRefType != "Projected": sdValues = self.sd.values() if len(sdValues): maxRadius = max(sdValues) largerExtent = UTILS.increaseExtentByConstant( ssdo.extent, constant=maxRadius) largerExtent = [LOCALE.str(i) for i in largerExtent] ARCPY.env.XYDomain = " ".join(largerExtent) #### Create Output Feature Class #### ARCPY.SetProgressor("default", ARCPY.GetIDMessage(84003)) outPath, outName = OS.path.split(outputFC) try: DM.CreateFeatureclass(outPath, outName, "POLYGON", "", ssdo.mFlag, ssdo.zFlag, ssdo.spatialRefString) except: ARCPY.AddIDMessage("ERROR", 210, outputFC) raise SystemExit() #### Add Fields to Output FC #### dataFieldNames = UTILS.getFieldNames(sdFieldNames, outPath) shapeFieldNames = ["SHAPE@"] for fieldName in dataFieldNames: UTILS.addEmptyField(outputFC, fieldName, "DOUBLE") caseIsDate = False if caseField: fcCaseField = ssdo.allFields[caseField] validCaseName = UTILS.validQFieldName(fcCaseField, outPath) caseType = UTILS.convertType[fcCaseField.type] UTILS.addEmptyField(outputFC, validCaseName, caseType) dataFieldNames.append(validCaseName) if caseType.upper() == "DATE": caseIsDate = True #### Write Output #### badCaseRadians = [] allFieldNames = shapeFieldNames + dataFieldNames rows = DA.InsertCursor(outputFC, allFieldNames) for case in self.caseKeys: #### Get Results #### xVal, yVal = self.meanCenter[case] radius = self.sd[case] #### Create Empty Polygon Geomretry #### poly = ARCPY.Array() #### Check for Valid Radius #### radiusZero = UTILS.compareFloat(0.0, radius, rTol=.0000001) radiusNan = NUM.isnan(radius) radiusBool = radiusZero + radiusNan if radiusBool: badRadian = 6 badCase = UTILS.caseValue2Print(case, self.caseIsString) badCaseRadians.append(badCase) else: badRadian = 0 #### Calculate a Point For Each #### #### Degree in Circle Polygon #### for degree in NUM.arange(0, 360): try: radians = NUM.pi / 180.0 * degree pntX = xVal + (radius * NUM.cos(radians)) pntY = yVal + (radius * NUM.sin(radians)) pnt = ARCPY.Point(pntX, pntY, ssdo.defaultZ) poly.add(pnt) except: badRadian += 1 if badRadian == 6: badCase = UTILS.caseValue2Print( case, self.caseIsString) badCaseRadians.append(badCase) break if badRadian < 6: #### Create and Populate New Feature #### poly = ARCPY.Polygon(poly, None, True) rowResult = [poly, xVal, yVal, radius] if caseField: caseValue = case.item() if caseIsDate: caseValue = TUTILS.iso2DateTime(caseValue) rowResult.append(caseValue) rows.insertRow(rowResult) #### Report Bad Cases Due to Geometry (coincident pts) #### nBadRadians = len(badCaseRadians) if nBadRadians: if caseField: badCaseRadians = " ".join(badCaseRadians) ARCPY.AddIDMessage("WARNING", 1011, caseField, badCaseRadians) else: ARCPY.AddIDMessage("ERROR", 978) raise SystemExit() #### Return Extent to Normal if not Projected #### if ssdo.spatialRefType != "Projected": ARCPY.env.XYDomain = None #### Clean Up #### del rows #### Set Attribute #### self.outputFC = outputFC
def createOutput(self, outputFC): #### Shorthand Attributes #### ssdoBase = self.ssdoBase ssdoCand = self.ssdoCand #### Validate Output Workspace #### ARCPY.overwriteOutput = True ERROR.checkOutputPath(outputFC) #### Create Output Feature Class #### ARCPY.SetProgressor("default", ARCPY.GetIDMessage(84003)) outPath, outName = OS.path.split(outputFC) try: DM.CreateFeatureclass(outPath, outName, "POINT", "", ssdoBase.mFlag, ssdoBase.zFlag, ssdoBase.spatialRefString) except: ARCPY.AddIDMessage("ERROR", 210, outputFC) raise SystemExit() #### Add Null Value Flag #### outIsShapeFile = UTILS.isShapeFile(outputFC) setNullable = outIsShapeFile == False #### Add Shape/ID Field Names #### matchID, candID = outputIDFieldNames outFieldNames = ["SHAPE@"] + outputIDFieldNames UTILS.addEmptyField(outputFC, matchID, "LONG", nullable = True) UTILS.addEmptyField(outputFC, candID, "LONG", nullable = True) #### Add Append Fields #### lenAppend = len(self.appendFields) appendIsDate = [] in2OutFieldNames = {} if lenAppend: for fieldName in self.appendFields: fcField = ssdoCand.allFields[fieldName] fieldType = UTILS.convertType[fcField.type] fieldOutName = UTILS.validQFieldName(fcField, outPath) in2OutFieldNames[fieldName] = fieldOutName if fieldType == "DATE": appendIsDate.append(fieldName) UTILS.addEmptyField(outputFC, fieldOutName, fieldType, alias = fcField.alias) outFieldNames.append(fieldOutName) #### Add Analysis Fields #### for fieldName in self.fieldNames: fcField = ssdoBase.allFields[fieldName] fieldType = UTILS.convertType[fcField.type] fieldOutName = UTILS.validQFieldName(fcField, outPath) in2OutFieldNames[fieldName] = fieldOutName UTILS.addEmptyField(outputFC, fieldOutName, fieldType, alias = fcField.alias) outFieldNames.append(fieldOutName) dataFieldNames = matchFieldInfo[self.similarType] dataFieldInfo = outputFieldInfo[self.matchMethod] baseValues = [] for fieldName in dataFieldNames: outAlias, outType, baseValue = dataFieldInfo[fieldName] UTILS.addEmptyField(outputFC, fieldName, outType, alias = outAlias, nullable = setNullable) outFieldNames.append(fieldName) baseValues.append(baseValue) #### Step Progress #### featureCount = ssdoBase.numObs + self.numResults if self.similarType == "BOTH": featureCount += self.numResults ARCPY.SetProgressor("step", ARCPY.GetIDMessage(84003), 0, featureCount, 1) #### Get Insert Cursor #### rows = DA.InsertCursor(outputFC, outFieldNames) #### Set Base Data #### useShapeNull = outIsShapeFile if useShapeNull: nullIntValue = UTILS.shpFileNull['LONG'] else: nullIntValue = None #### Set Base Null For Append #### appendNull = {} for fieldName in self.appendFields: if fieldName not in ssdoBase.fields: if useShapeNull: outType = ssdoCand.fields[fieldName].type outNullValue = UTILS.shpFileNull[outType] else: outNullValue = None appendNull[fieldName] = outNullValue #### Add Base Data #### for orderID in xrange(ssdoBase.numObs): x,y = ssdoBase.xyCoords[orderID] pnt = (x, y, ssdoBase.defaultZ) #### Insert Shape, Match_ID and NULL (Cand_ID) #### rowRes = [pnt, ssdoBase.order2Master[orderID], nullIntValue] #### Add Append Fields #### for fieldName in self.appendFields: if fieldName in appendNull: rowRes.append(appendNull[fieldName]) else: value = ssdoBase.fields[fieldName].data[orderID] if fieldName in appendIsDate: value = TUTILS.iso2DateTime(value) rowRes.append(value) #### Add Analysis Fields #### for fieldName in self.fieldNames: rowRes.append(ssdoBase.fields[fieldName].data[orderID]) #### Add Null Base Values #### rowRes += baseValues rows.insertRow(rowRes) ARCPY.SetProgressorPosition() if self.similarType in ['MOST_SIMILAR', 'BOTH']: #### First Add Similar Results #### for ind, orderID in enumerate(self.topIDs): x,y = ssdoCand.xyCoords[orderID] pnt = (x, y, ssdoBase.defaultZ) #### Insert Shape, NULL (Match_ID) and Cand_ID #### rowRes = [pnt, nullIntValue, ssdoCand.order2Master[orderID]] #### Add Append Fields #### for fieldName in self.appendFields: rowRes.append(ssdoCand.fields[fieldName].data[orderID]) #### Add Analysis Fields #### for fieldName in self.fieldNames: rowRes.append(ssdoCand.fields[fieldName].data[orderID]) #### Add Results #### rank = ind + 1 ss = self.totalDist[orderID] if self.similarType == 'BOTH': rowRes += [rank, nullIntValue, ss, rank] else: rowRes += [rank, ss, rank] rows.insertRow(rowRes) ARCPY.SetProgressorPosition() if self.similarType in ['LEAST_SIMILAR', 'BOTH']: #### Add Least Similar #### for ind, orderID in enumerate(self.botIDs): x,y = ssdoCand.xyCoords[orderID] pnt = (x, y, ssdoBase.defaultZ) #### Insert Shape, NULL (Match_ID) and Cand_ID #### rowRes = [pnt, nullIntValue, ssdoCand.order2Master[orderID]] #### Add Append Fields #### for fieldName in self.appendFields: rowRes.append(ssdoCand.fields[fieldName].data[orderID]) #### Add Analysis Fields #### for fieldName in self.fieldNames: rowRes.append(ssdoCand.fields[fieldName].data[orderID]) #### Add Results #### rank = ind + 1 labRank = rank * -1 ss = self.totalDist[orderID] if self.similarType == 'BOTH': rowRes += [nullIntValue, rank, ss, labRank] else: rowRes += [rank, ss, labRank] rows.insertRow(rowRes) ARCPY.SetProgressorPosition() #### Clean Up #### del rows #### Symbology #### params = ARCPY.gp.GetParameterInfo() try: renderKey = (self.similarType, 0) renderLayerFile = outputRenderInfo[renderKey] templateDir = OS.path.dirname(OS.path.dirname(SYS.argv[0])) fullRLF = OS.path.join(templateDir, "Templates", "Layers", renderLayerFile) params[2].Symbology = fullRLF except: ARCPY.AddIDMessage("WARNING", 973)