Probleme mit korrekter numpy synthax - TypeError: narray.fie

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
JoB
User
Beiträge: 25
Registriert: Mittwoch 14. Januar 2015, 13:01

Was bedeutet folgende Fehlermeldung???

arcpy.da.NumPyArrayToTable(npa, fcout)
TypeError: narray.fields require

Code unter:
https://geonet.esri.com/thread/120703
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

JoB hat geschrieben:Code unter:
https://geonet.esri.com/thread/120703
Du hast dort schon die Antwort bekommen, warum hier nochmal fragen?
a fool with a tool is still a fool, www.magben.de, YouTube
BlackJack

@JoB: Welcher Code dort? Ein minimales, lauffähiges Beispiel wäre nett. Und die komplette Fehlermeldung damit man auch sieht wo genau die Ausnahme auftritt.

Mal so geraten: Diese ArcGIS-Tabellen haben doch sicher Spaltennamen. Wo und wie legst Du die fest?
JoB
User
Beiträge: 25
Registriert: Mittwoch 14. Januar 2015, 13:01

Code: Alles auswählen

# -*- coding: cp1252 -*-
# Export zu rastercatalog.dbf
# Autor Xander Bakker, Dan Patterson - vermurkst JB

import arcpy, os, math, numpy
from arcpy import env
Fgdb = r"R:\Karto\Bierer2014\Datenabgabe\20150113_Brandt\raster\RasterCatalog.gdb"
arcpy.env.workspace = r"R:\Karto\Bierer2014\Datenabgabe\20150113_Brandt\raster\RasterCatalog.gdb"
# Ausgabepfad = (r"R:\Karto\Bierer2014\Datenabgabe\20150113_Brandt\raster").strip()
Ausgabepfad = r"R:\Karto\Bierer2014\Datenabgabe\20150113_Brandt\raster"

ext = ".jpg"
ext = ".jpg"  
fc = os.path.join(Ausgabepfad, "Orthos_Nummern.shp")
fcout = os.path.join(Ausgabepfad, "imagecatalog.dbf")
fld_oid = "OBJECT_ID" # or: arcpy.Describe(fc).OIDFieldName  
fld_out = "IMAGE" # should exist in shapefile
fld_xmin = "XMIN"
fld_xmax = "XMAX"


arcpy.AddField_management(fc, "XMIN", "LONG", 7) # , "", "", "refcode", "NULLABLE", "REQUIRED")
arcpy.AddField_management(fc, "XMAX", "LONG", 7) # , "", "", "refcode", "NULLABLE", "REQUIRED")
arcpy.AddField_management(fc, "YMIN", "LONG", 7) # , "", "", "refcode", "NULLABLE", "REQUIRED")
arcpy.AddField_management(fc, "YMAX", "LONG", 7) # , "", "", "refcode", "NULLABLE", "REQUIRED")

input_shp = fc
arr = arcpy.Array()  
with arcpy.da.UpdateCursor(input_shp,['FID','SHAPE@']) as cur:  
  extents = []   
  for row in cur:  
    ext = row[1].extent  
    p0 = ext.lowerLeft; p1 = ext.upperRight  
    print('Extent of shape... {}: '.format(row[0]))  
    print(' X min/max  {}, {}'.format(ext.XMin,ext.XMax))
    Xmin = round((ext.XMin), 0)
    print (Xmin)
    Xmax = round((ext.XMax), 0)
    print (Xmax)
    
    dt = numpy.int #('<f8')# dt = numpy.int
    dts = ([fld_xmin,fld_xmax])
    print (dts)
    npa = numpy.array(dt)
    array = ([Xmin, Xmax], dt)
    
    arcpy.da.NumPyArrayToTable(npa, fcout)

    print ( ' X min, {}'.format(ext.XMin))
    cur.updateRow(row)
    print(' Y min/max  {}, {}'.format(ext.YMin,ext.YMax))  
    arr.add(p0)  
    arr.add(p1)  
mp = arcpy.Multipoint(arr)  
print('Extent of all {}'.format(mp.extent))  
Feldname ist definiert mit fld_xmin/max. Fehler liegt in arcpy.da.NumPyArrayToTable(npa, fcout). Das scheint im script falsch zu sein?
Aber die Frage, wie es richtig definiert wird, wurde dort eben nicht für mich nachvollziehbar beantwortet :-)
BlackJack

@JoB: Die Feldnamen werden nicht definiert. `fld_min` und `fld_max` werden nicht verwendet, beziehungsweise indirekt nicht verwendet. Du erstellst eine Liste mit diesen beiden Zeichenketten darin (wobei dort überflüssige, sinnfreie runde Klammern um den Ausdruck stehen) und bindest diese Liste an den Namen `dts`. Dann gibst Du diese Liste mit ``print`` aus — sollte das Python 2 sein haben wir noch mal überflüssige Klammern die da nicht stehen sollten. Und weiter passiert gar nichts mit diesem Wert. Also abgesehen von der Ausgabe, deren Sinn ich nicht sehe, hat dieser Code-Teil keinen Sinn und Zweck.

An den Namen `npa` bindest Du ein Array mit einem Element und dieses Element ist ein Python-Objekt, nämlich die Klasse `int`. Das ist ebenfalls total sinnfrei. Genau wie die nächste Zeile in der Du ein Tupel bestehend aus einer Liste und der Klasse `int` an den Namen `array` bindest. Selbst wenn dieses Tupel irgendeinen Sinn ergeben würde — der Name `array` wird im weiteren Verlauf nicht verwendet. Also auch wieder komplett sinnfrei.

Das sieht mir extrem nach „Ich rate so lange herum bis irgendetwas klappt” aus. So funktioniert Programmieren nicht. Du solltest mindestens ein Python-Grundlagentutorial, zum Beispiel das aus der Python-Dokumentation, und das Numpy-Tutorial durcharbeiten um die Grundlagen zu lernen.
JoB
User
Beiträge: 25
Registriert: Mittwoch 14. Januar 2015, 13:01

Ja richtig - etwas chaotisch und nicht state of the art. Aber lernen tue ich es leider nicht durch Tutorials lesen :-)
Ziel ist den Attributfeldern einer .dbf eines shapefiles Werte zuzuweisen.
Atributfelder_
fld_xmin = "XMIN"
fld_xmax = "XMAX"
also dieFelder eines shapefiles in denen Koordinaten eingetragen werden sollen.
Diese Koordinaten kommen aus
Xmin = round((ext.XMin), 0) möglichst als integer Wert
Xmax = round((ext.XMax), 0)

Jetzt weiß ich nur nicht wie ich in arcpy.da.NumPyArrayToTable die Koordinaten den oben genannten Felder zuweise. Dass ist die einzige Frage zu der ich gerne hier Vorschläge hätte.
Das print Zeug habe ich nur zur Kontrolle ob ich die Richtigen Werte auslese.
BlackJack

@JoB: Nein, nur durch *lesen* von Tutorials lernen die meisten Leute nicht viel. Darum schrieb ich ja auch *durcharbeiten*. Also lesen, ausprobieren, verstehen, wenn etwas unklar ist in der Referenzdokumentation nachlesen, die Beispiele leicht ändern und sich vorher Gedanken darüber machen was sich dadurch am Ergebnis ändert, das dann überprüfen, falls etwas anderes als Erwartet heraus kommt, überlegen und nachlesen warum das so ist, und so weiter.

Ich kenne das `arcpy`-Package nicht, aber den Beispielen nach erwartet `arcpy.da.NumPyArrayToTable()` ein Numpy-Array mit benannten Feldern oder anders formuliert ein Arry mit „records”. Dein Quelltext ist aber *so* wirr dass es keinen Sinn macht Dir jetzt einfach das Beispiel hinzuschreiben, denn Du hast da offenbar ganz fundamentale Probleme oder Missverständnisse was das Programmieren angeht so dass man Dir keine Fragen wirklich nachvollziehbar beantworten kann ohne dass Du die Grundlagen vorher lernst. Sowohl die von Python als auch die von Numpy-Arrays.
Antworten