Hi Jody,
Thanks for your response. I already had received an answer from Andrea
which helped me solve my problem. Please, see below.
It seems I made a mistake when answering to the response from Andrea, as
you did not get informed, that my problem was solved. I appreciate the
work of all involved in GeoTools, that one can ask questions and get
help. Please, let me know how to correctly communicate; adding always
/GeoTools Users <geotools-gt2-users@lists.sourceforge.net>/ to the cc?
Regards,
Peter
----------------------------------------------------------------------------------------------------------------------------------------
Thanks for the quick response. Now, I know what I did wrong. Here is the
version that works:
public static Filter oddCorrectionNumberFilter() {
List<Expression> parStrSubstringStart = new ArrayList<>();
parStrSubstringStart.add(ff.property(CORRECTION));
parStrSubstringStart.add(ff.literal(4));
List<Expression> parParseInt = new ArrayList<>();
parParseInt.add(df.function("strSubstringStart",
parStrSubstringStart, null));
List<Expression> parModulo = new ArrayList<>();
parModulo.add(df.function("parseInt", parParseInt, null));
parModulo.add(ff.literal(2));
return ff.equals(df.function("modulo", parModulo, null),
ff.literal(1));
}
Before I made the mistake and added a function to the parameter list as:
parParseInt.add(*ff.literal*(df.function("strSubstringStart",
parStrSubstringStart, null)));
Regards,
Peter
Am 27.06.2021 um 12:19 schrieb Andrea Aime:
Functions take Expression objects as arguments, and Function is an
Expression.
So just call them as you would do in any programming language?
You do not say how you're trying to build the function calls, but I'm
assuming SLD?
If so, then it would be something like (warning, untested, you might
have to adjust it a bit):
<ogc:Function name="modulo">
<ogc:Function name="parseInt">
<ogc:Function name="strSubstringStart">
<ogc:PropertyName>myAttribute</ogc:PropertyName>
<ogc:Literal>3</ogc:Literal>
</ogc:Function>
</ogc:Function>
<ogc:Literal>2</ogc:LIteral>
</ogc:Function>
By the way, I don't remember about a "modulo" function or operator, there
is a IEEERemainder it's a floating point one
Cheers
Andrea
------------------------------------------------------------
Am 29.06.2021 um 01:18 schrieb Jody Garnett:
I expect you can do what you need using an expression:
Recode( modulo( strSubstringStart( attribute, ,3), 2),
0, '#FF0000'.
1, '#00GG00'
)
If you are using YSLD for styling you can define this as a variable
for reuse (for example polygon outline and fill):
# define here
define: &mycolor Recode( modulo( strSubstringStart( attribute, ,3),
2), 0, '#FF0000'. 1, '#00GG00')
# reuse as needed
- polygon:
stroke-color: *mycolor
fill-color: *mycolor
fill-opacity: 0.25
If you do need to write your own Java function there are lots of ways
to reuse function code:
* Many of the functions have a static method (making the
implementation easier to test). When writing your own function you
can make use of these static methods to reuse functionality. The
static method approach is used for the original
autogenerated functions: FilterFunction_greatThan.java
<https://github.com/geotools/geotools/blob/main/modules/library/main/src/main/java/org/geotools/filter/function/FilterFunction_greaterThan.java>
* You can also create functions, or filters, and make use of them
directly in your implementation. The implementation of
FilterFunction_equalTo
<https://github.com/geotools/geotools/blob/main/modules/library/main/src/main/java/org/geotools/filter/function/FilterFunction_equalTo.java>
was
replaced to reference the create a filter (thus using the exact
same implementation).
* You can also extend an existing implementation to reuse code and
register your new function with factory spi.
Another fun idea would be to make something like a function defined
by a CQL expression. This would only help readability, there would not
be a performance benefit.
--
Jody Garnett
On Sat, 26 Jun 2021 at 04:04, Peter Friess <pk.fri...@t-online.de
<mailto:pk.fri...@t-online.de>> wrote:
Hi There,
I was wondering if there exists a way of combining several functions
into one. I mean, that I can use the result of one function as input
parameter into the next function etc., kind of chaining functions.
Concrete: I have a feature which has among others a String attribute
which looks like "PC_L1", PC_L2" etc. i.e a numbered identifier. I
want
to color code the features, by using a modulo function on the number
(even with a certain color, odd with a certain color). I therefore
need
to extract the number with "strSubstringStart" convert it to an
integer
with "parseInt" and then use "modulo". Is it possible to do this
somehow? If yes, how?
Thanks in advance
Peter Friess
PS: if this is not possible, I need to introduce another attribute
for
just the number.
_______________________________________________
GeoTools-GT2-Users mailing list
GeoTools-GT2-Users@lists.sourceforge.net
<mailto:GeoTools-GT2-Users@lists.sourceforge.net>
https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users
<https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users>
_______________________________________________
GeoTools-GT2-Users mailing list
GeoTools-GT2-Users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users