If we have an attribute table in gvSIG we can obtain the number of registers for each different value of a field, how many times they are repeated.
For that we will have to create a new script in gvSIG, from the Tools->Scripting->Scripting Composer menu.
Once it is created, naming it as we want, we copy this source code on it:
from gvsig import *
import commonsdialog
from org.gvsig.andami import Utilities
import os, time
from gvsig import *
from org.gvsig.app.project.documents.table import TableManager
def loadTable(format, **parameters):
try:
application = ApplicationLocator.getManager()
datamanager = application.getDataManager()
# Loding the data store
store_parameters = datamanager.createStoreParameters(format)
copyToDynObject(parameters, store_parameters)
store = datamanager.openStore(format, store_parameters)
# Creating a Table document and initialize with the data store
project = currentProject()
table = project().createDocument(TableManager.TYPENAME)
table.setStore(store)
table.setName(store.getName())
# Add the Table document to the project
project().addDocument(table)
except Throwable, ex:
raise RuntimeException("Can't load table, "+ str(ex))
return table
def loadDBF(dbffile):
table = loadTable(format="DBF",DbfFile=dbffile)
return table
def getTempFile(name, ext):
tempdir = Utilities.TEMPDIRECTORYPATH
if not os.path.isdir(tempdir):
os.makedirs(tempdir)
t = time.time()
f = os.path.join(
tempdir,
"%s-%x%x%s" % (name,t,(t-int(t)) * 10000,ext)
)
return f
def main(*args):
print "Count values"
table = currentTable()
field = str(commonsdialog.inputbox("Name of the field"))
try:
features = table.features()
except:
commonsdialog.msgbox("Table not opened")
count = dict()
for f in features:
ff = str(f.get(field))
if ff in count.keys():
count[ff] += 1
else:
count[ff] = 1
print count
sch = createSchema()
sch.append('ID','STRING',15)
sch.append('COUNT','INTEGER',20)
dbf = createDBF(sch, getTempFile("count"+field,".dbf"))
print type(dbf())
print "full name: ", dbf.getFullName()
#Insert table data
dbf.edit()
for k,v in count.iteritems():
f = dbf.createNewFeature()
f.set('ID',k)
f.set('COUNT',v)
dbf.insert(f)
dbf.commit()
d = loadDBF( dbf.getFullName())
print dbf.getFullName()
return
Finally we save the script.
Then from the View in gvSIG we put the layer that we want to use for the calculation active, and we open its attribute table. After that, we open the Scripting Launcher (Tools->Scripting->Scripting Launcher menu).
Double-clicking on the script that we had created, a new window will be opened, where we have to write the name of the field over which we can apply the counter. After accepting a new table will be created with the results. We will open the Project Manager (from Show menu), and we will have the new table at the “Table” document.
That table is a temporary element, so we will have to export it to a dbf file in order to have it on disk (Table->Export to menu).




