[Gvsig_english] How to access schema from an input shapefile in scripting

Silvia Franceschi silvia.franceschi at gmail.com
Fri Oct 14 13:54:15 CEST 2016


Thank you Óscar for your detailed explanation and your help!

Silvia

On Fri, Oct 14, 2016 at 11:59 AM, Óscar Martínez <omartinez at gvsig.com>
wrote:

> Reading again your email maybe this also answer your question:
>
> Inside the script you can make a: print dir(layer) and it will show you
> the avalaible functions of that type of object.
>
> El 14/10/16 a las 11:26, Óscar Martínez escribió:
>
> Hi Silvia,
>
>
> |    Is there a way to know which functions are implemented for each
> feature type in gvSIG scripting?
>
> If i understand correctly your question.. Quick answer, all. Since 2.3, we
> are not working with a different library for scripting. We improved the way
> to work directly with the JAVA API, plus new functions (like..
> createShape(schema)), methods (like.. getValues() over a feature to return
> a python dict) and new classes (like.. FormPanel to create scripts with
> graphical interface), all to make it easy and quick to work from scripting.
> Not sure if is a good way to say it (just to explain this better), but we
> could say right now is the java api who hasn't have all the funcions
> implemented.
>
> As you can see in the script, type(layer) and type(features) are java
> objects.
>
> Running script.
> layer type:  <type 'org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect'>
> layer features:  <type 'org.gvsig.fmap.dal.feature.impl.featureset.
> DefaultFeatureSet'>
> Script terminated.
>
> So, you should be able to check the javadocs, and use all the functions
> that are in there:
>
> http://downloads.gvsig.org/download/gvsig-desktop-
> testing/dists/2.3.0/javadocs/html/
>
> http://downloads.gvsig.org/download/gvsig-desktop-
> testing/dists/2.3.0/javadocs/html/org/gvsig/fmap/
> mapcontext/layers/vectorial/FLyrVect.html
>
> http://downloads.gvsig.org/download/gvsig-desktop-
> testing/dists/2.3.0/javadocs/html/org/gvsig/fmap/dal/
> feature/impl/featureset/DefaultFeatureSet.html
>
>
> Plus all from scripting (we are updating this javadoc, soon will be more
> complete):
>
> http://downloads.gvsig.org/download/gvsig-desktop-
> testing/dists/2.3.0/docs/javadocs/html/
>
>
> Deleting features should be something similar to this (delete all features
> with a filter "ID < 10"):
> # encoding: utf-8
>
> from gvsig import *
>
> def main(*args):
>     """ Delete features inside a layer"""
>
>     layer = currentLayer()
>     features = layer.features("ID < 10") #DefaultFeatureSet
>
>
>     print "layer type: ", type(layer)
>     print "layer features: ", type(features)
>
>     layer.edit()
>
>     for i in features:
>         ivalues = i.getValues()
>         print ivalues
>         features.delete(i)#delete over the featureset
>
>     layer.commit()
>
>
> Best regards,
> Óscar
>
>
> El 14/10/16 a las 10:53, Silvia Franceschi escribió:
>
> Hi Óscar,
> the scripts work fine, many thanks again!
> May I just ask you one more question?
> Is there the possibility to remove a feature from a list of features? like
> featureslist.remove() or something like that?
> I tried with remove and delete but it seems that these do not exist, any
> idea?
>
> Is there a way to know which functions are implemented for each feature
> type in gvSIG scripting?
>
> Thanks
>
> Silvia
>
>
> On Thu, Oct 13, 2016 at 6:25 PM, Silvia Franceschi <
> silvia.franceschi at gmail.com> wrote:
>
>> Thank you Óscar,
>> to tell you the truth I started to use currentLayer but, since I need to
>> work with two layers I didn't know how to do and tried to load data from
>> files.
>> And in any case the final script should work with a list of shapefiles in
>> a folder, so, I will for sure move to the file based data source at some
>> point.
>>
>> I was following the documentation you linked, it is very useful to start
>> to get familiar with the scripting environment, thanks!
>>
>> I will try the scripts you sent to me and let you know if I will solve my
>> problems.
>>
>> Thank you very much for the quick answer!
>>
>> Silvia
>>
>>
>>
>>
>> On Thu, Oct 13, 2016 at 6:00 PM, Óscar Martínez <omartinez at gvsig.com>
>> wrote:
>>
>>> Hi!
>>>
>>> If i understood correctly, you don't need to use the getSchema function.
>>> I'm going to give you my solution with two test layers, give it a try and
>>> tell us if that works for you or what exactly more do you need. If you
>>> don't understand some part of the script i can explain it better. Some help
>>> is inside the script, step by step.
>>>
>>> I recommend to you to start learning scripting using the functions
>>> currentLayer() (current layer selection in the table of contents) or
>>> currentView().getLayer("layername") instead of using loadShapeFile
>>> everytime. It's easier if you just have a loaded layer in your view and
>>> access to each one each layer with currentLayer o getLayer.
>>>
>>> If someone on the list want to know more about this part of scripting,
>>> here are some links from the spanish docs (hope soon in english) related to
>>> this post:
>>>
>>> Access to features: http://downloads.gvsig.org/dow
>>> nload/web/html/es/scripting_devel_guide/2.3/acceso_a_objetos
>>> .html#entidad
>>>
>>> Spatial operations: http://downloads.gvsig.org/dow
>>> nload/web/html/es/scripting_devel_guide/2.3/modulo_geom.html
>>> #operaciones-espaciales
>>>
>>> Current functions: http://downloads.gvsig.org/dow
>>> nload/web/html/es/scripting_devel_guide/2.3/acceso_a_objetos.html
>>>
>>>
>>> Any trouble here we are!
>>>
>>>
>>> Best regards,
>>>
>>> Óscar
>>>
>>>
>>>
>>> Script (layers of this test are in EPSG:25830) (feature AREA1 is a
>>> multipolygon):
>>>
>>> # encoding: utf-8
>>>
>>> import gvsig
>>>
>>> def main(*args):
>>>     # You need to have one view with to layers opened on it
>>>     # The name of the layers will be the name that appear
>>>     # in the table of contents of the view
>>>
>>>     # To access to the layers that are already loaded in gvSIG
>>>     # gvsig.currentView() give us access to the opened view
>>>     # gvsig.currentView().getLayer(name) give us access a specified
>>> layer
>>>     points = gvsig.currentView().getLayer("points")
>>>     area = gvsig.currentView().getLayer("area")
>>>
>>>     # Access to the features
>>>     features_points = points.features()
>>>     features_area = area.features()
>>>
>>>     # if you want access to a selection of features, not all
>>>     # you will have to change `features()` with `getSelection()`
>>>     #features_points = points.getSelection()
>>>     #features_area = area.getSelection()
>>>
>>>     for farea in features_area:
>>>         print "\nChecking : ", farea.get("localId")
>>>         geom_farea = farea.geometry()
>>>
>>>         #for each area, check all points without intersection
>>>         for fpoint in features_points:
>>>             geom_fpoint = fpoint.geometry()
>>>
>>>             if not geom_farea.intersects(geom_fpoint):
>>>                 print "\tArea: ", farea.get("localId"), " intersects
>>> with :", fpoint.get("ID")
>>>                 # work with the feature
>>>
>>> Console output:
>>>
>>> Running script testing_silvia_intersec.
>>>
>>> Checking :  AREA1
>>>     Area:  AREA1  intersects with : 101
>>>     Area:  AREA1  intersects with : 102
>>>     Area:  AREA1  intersects with : 103
>>>     Area:  AREA1  intersects with : 107
>>>
>>> Checking :  AREA2
>>>     Area:  AREA2  intersects with : 103
>>>     Area:  AREA2  intersects with : 104
>>>     Area:  AREA2  intersects with : 105
>>>     Area:  AREA2  intersects with : 106
>>>     Area:  AREA2  intersects with : 107
>>>     Area:  AREA2  intersects with : 108
>>> Script testing_silvia_intersec terminated.
>>>
>>>
>>>
>>> El 13/10/16 a las 15:05, Silvia Franceschi escribió:
>>>
>>> Hi all,
>>> I am trying to write my first script in gvSIG and Python, I need to read
>>> a point shapefile and filter some elements that are outside a defined area.
>>> To do this I have to read two input layers, one with the points and one
>>> with the area and then work on each single features of the point layer.
>>> I started with the selection of the input layers using a filechooser
>>> dialog (commonsdialog.filechooser) and then I need to obtain the schema of
>>> these layers, but it seems that the object filechooser do not have the
>>> .getSchema() function.
>>> Do you have any idea on how to obtain the schema from a vector layer
>>> selected using the filechooser?
>>>
>>> Thanks in advance for any help!
>>>
>>> Silvia
>>>
>>>
>>> --
>>> ing. Silvia Franceschi
>>> Via Latemar, 22
>>> 38030 Castello di Fiemme (TN)
>>>
>>> tel: 0039 -3384501332 <0039%20-3384501332>
>>>
>>>
>>> _______________________________________________
>>> Gvsig_internacional mailing listGvsig_internacional at listserv.gva.es
>>>
>>> To see the archives, edit your preferences or unsubscribe from this mailing list, please access this url:
>>> https://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_internacional
>>>
>>> _______________________________________________ Gvsig_internacional
>>> mailing list Gvsig_internacional at listserv.gva.es To see the archives,
>>> edit your preferences or unsubscribe from this mailing list, please access
>>> this url: https://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_inter
>>> nacional
>>
>> --
>> ing. Silvia Franceschi Via Latemar, 22
>> 38030 Castello di Fiemme (TN) tel: 0039 -3384501332
>>
> --
> ing. Silvia Franceschi Via Latemar, 22
> 38030 Castello di Fiemme (TN) tel: 0039 -3384501332
>
> _______________________________________________
> Gvsig_internacional mailing listGvsig_internacional at listserv.gva.es
>
> To see the archives, edit your preferences or unsubscribe from this mailing list, please access this url:
> https://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_internacional
>
> _______________________________________________
> Gvsig_internacional mailing listGvsig_internacional at listserv.gva.es
>
> To see the archives, edit your preferences or unsubscribe from this mailing list, please access this url:
> https://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_internacional
>
>
> _______________________________________________
> Gvsig_internacional mailing list
> Gvsig_internacional at listserv.gva.es
>
> To see the archives, edit your preferences or unsubscribe from this
> mailing list, please access this url:
>
> https://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_internacional
>
>


-- 
ing. Silvia Franceschi
Via Latemar, 22
38030 Castello di Fiemme (TN)

tel: 0039 -3384501332
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listserv.gva.es/pipermail/gvsig_internacional/attachments/20161014/bdbcde54/attachment.html>


More information about the Gvsig_internacional mailing list