My layer was defined using SimplePointEncoder.class but I changed to WTK:

runningLayer = (EditableLayer) 
                graphDBSpatial.getOrCreateLayer(layerName, 
                    WKBGeometryEncoder.class, 
                        EditableLayerImpl.class, 
                            geomEncoderConfig);   

This works fine, i.e., for the envelope it returns only one object which is 
a vertex, 
I tried another envelope (0.5,1.5, - 0.5,1.5) and it works fine too 
(returns three objects which is correct).

However, I am not sure if my definition of layer is correct. 

Best,
Alireza


On Tuesday, September 9, 2014 1:23:44 PM UTC+2, Craig Taverner wrote:
>
> Hi Alireza,
>
> I opened your graph in the neo4j server and looked around, and then also 
> write some Java test code (based on your snippet) to see what I could see. 
> The main conclusion is that I see two nodes (not one) that are in the 
> envelope, nodes with n.id=2 and n.id=10.
>
> I've attached screenshots of the Neo4j browser looking at the data, a 
> graph view showing the nodes and the spatial layer connected to them, and a 
> cypher query that lists the key properties. The cypher query I used was:
>
> MATCH (n) WHERE has(n.gtype) RETURN id(n), n.id, n.gtype, n.x, n.y, 
> n.bbox, n.dim, n.eid
>
>
> Some interesting points I can see:
>
>    - There are definitely two nodes with x=1, y=1 which should be inside 
>    Envelope(0.5,1.5,0.5,1.5).
>    - The use of a property 'id' is allowed, but a little confusing 
>    because it is easy to think that might be the node id (see that I'm 
> listing 
>    the node id and the node property 'id' just to be clear)
>    - I'm surprised by the fact that there are three different gtype 
>    values: 1, 2, 3, which mean POINT, LINESTRING, POLYGON respectively, but 
>    clearly these are all points (they have only x,y information). This means 
>    that these objects were not created by the Neo4j Spatial library, but 
>    created by some other code? How did you create them? I suspect there is 
>    something not quite right there.
>    - The BBox values for POINT objects should be points themselves (ie. 
>    (x1,y1) == (x2,y2)). And in fact I see for all objects with gtype==1, this 
>    is true. For other objects, you have bigger bounding boxes, which makes 
>    sense for the type, but since they are actually only points, it no longer 
>    makes sense.
>    - When I look into the layer node, I see that the GeometryEncoder is 
>    the SimplePointEncoder, consistent with the observation that all data are 
>    x,y pairs (Points)
>    - But I see the layer implementation is the EditableLayerImpl, which 
>    is more often used for WKT Geometries (allowing LineString and Polygon 
>    also).
>
> The test code that I wrote was in Java and based on your sample. The main 
> part of the code looks like this:
> SpatialDatabaseService spatial = new SpatialDatabaseService(graphDb);
> Layer layer = spatial.getLayer(layerName);
> GeometryFactory gf = layer.getGeometryFactory();
> Envelope envelope = new Envelope(0.5, 1.5, 0.5, 1.5);
> Geometry geom = gf.toGeometry(envelope);
> try (Transaction tx = graphDb.beginTx()) {
> List<Node> nodes = GeoPipeline.startWithinSearch(layer, geom).toNodeList();
> for (Node node : nodes) {
> System.out.println("Node[" + node.getId() + ":" + node.getProperty("id") + 
> "]: " + nodeXY(node) + " - "
> + nodeBBox(node));
> }
> assertEquals("Only one node should be in envelope", nodes.size(), 2);
> tx.success();
> }
>
> This test passes on the two nodes that look like Point(1,1) as expected. 
> However, since you probably meant the second one to be a LineString 
> (gtype=2), it probably was supposed to intersect the envelope, not be 
> included. But since you use the SimplePointEncoder, it will be seen as a 
> point at 1,1, so it will be included.
>
> My understanding is that you created the data incorrectly, using a 
> SimplePointEncoder for data that you meant to be LineString and Polygon. I 
> suggest that you rather use the WKT encoder. Do not create the nodes 
> yourself, but use the layer.add(Geometry) to create them for you, and then 
> add your own properties to them afterward, so you are sure the geoemtry 
> information is correctly created.
>
> Regards, Craig
>
>
>
> On Thu, Sep 4, 2014 at 1:03 PM, Alireza Rezaei Mahdiraji <
> alire...@gmail.com <javascript:>> wrote:
>
>>
>> Hi Craig, 
>>
>> I attached the neo4j database folder for the toy example I am using. 
>>
>> The envelop I am using is as follow: xmin: 0.5, xmax: 1.5,  ymin: -0.5, 
>> ymax: 1.5
>>
>> This envelop only contains one graph vertex fully, the vertex with x=1 
>> and y=1
>> but code returns several other results too which are partially contained 
>> by the envelop. 
>>
>> Thanks,
>> Best,
>> Alireza
>>
>> On Wednesday, September 3, 2014 5:08:36 PM UTC+2, Craig Taverner wrote:
>>>
>>> Hi Alireza,
>>>
>>> That code looks OK. Could you send me some sample data? I could try this 
>>> myself and see what the problem is. The code underneath is using the JTS 
>>> function Geometry.within(Geometry) and that is strictly defined. See 
>>> http://tsusiatsoftware.net/jts/javadoc/com/vividsolutions/jts/geom/
>>> Geometry.html#within(com.vividsolutions.jts.geom.Geometry).
>>>
>>> But if I try your data I could double-check if there is perhaps an issue 
>>> in how we use this.
>>>
>>> Regards, Craig
>>>
>>>
>>>
>>> On Wed, Sep 3, 2014 at 3:15 PM, Alireza Rezaei Mahdiraji <
>>> alire...@gmail.com> wrote:
>>>
>>>>
>>>> I tried this snippet: 
>>>>
>>>> GeometryFactory gf = layer.getGeometryFactory();
>>>> Geometry geom = gf.toGeometry(envelope);
>>>> List<Node> nodes = GeoPipeline.startWithinSearch(layer, 
>>>> geom).toNodeList();
>>>>
>>>> but the result still contains nodes which are not fully inside the 
>>>> envelope. 
>>>>
>>>> What am I missing?
>>>>
>>>> Thanks,
>>>>
>>>> Alireza
>>>>
>>>>
>>>> On Tuesday, September 2, 2014 10:35:38 AM UTC+2, Craig Taverner wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> I can see two ways in the Java API to do this. One is the 'within' 
>>>>> filter in the GeoPipeline.
>>>>>
>>>>>    - See example usage in the test code at 
>>>>>    - See the implementation using JTS in the code at 
>>>>>    https://github.com/neo4j-contrib/spatial/blob/master/src/
>>>>>    main/java/org/neo4j/gis/spatial/pipes/filtering/FilterWithin
>>>>>    .java#L47 
>>>>>    
>>>>> <https://github.com/neo4j-contrib/spatial/blob/master/src/main/java/org/neo4j/gis/spatial/pipes/filtering/FilterWithin.java#L47>
>>>>>  
>>>>>
>>>>> And the other is the older, but still functional use of CQL for within 
>>>>> queries:
>>>>>
>>>>>    - See an example using dynamic layers at https://github.com/neo4j-
>>>>>    contrib/spatial/blob/master/src/test/java/org/neo4j/gis/spatia
>>>>>    l/TestDynamicLayers.java#L138 
>>>>>    
>>>>> <https://github.com/neo4j-contrib/spatial/blob/master/src/test/java/org/neo4j/gis/spatial/TestDynamicLayers.java#L138>
>>>>>  
>>>>>    - And the implementation at https://github.com/neo4j-co
>>>>>    ntrib/spatial/blob/master/src/main/java/org/neo4j/gis/spatia
>>>>>    l/filter/SearchCQL.java#L56 
>>>>>    
>>>>> <https://github.com/neo4j-contrib/spatial/blob/master/src/main/java/org/neo4j/gis/spatial/filter/SearchCQL.java#L56>
>>>>>    
>>>>> A direct usage of the SearchCQL class is also possible, but I did not 
>>>>> see a test case for it. It was used by the GeoServer integration though.
>>>>>
>>>>> Regards, Craig
>>>>>  
>>>>>
>>>>> On Mon, Sep 1, 2014 at 5:15 PM, Alireza Rezaei Mahdiraji <
>>>>> alire...@gmail.com> wrote:
>>>>>
>>>>>>  
>>>>>> Hi All, 
>>>>>>
>>>>>> I would like to find nodes of the graph which are completely (not 
>>>>>> partially) contained in a given 
>>>>>> Envelope. I tried several GeoPipeline methods but it seems they all 
>>>>>> consider partial containment. 
>>>>>> Any idea? 
>>>>>>
>>>>>> Thanks,
>>>>>> Best,
>>>>>> Alireza
>>>>>>
>>>>>>  -- 
>>>>>> You received this message because you are subscribed to the Google 
>>>>>> Groups "Neo4j" group.
>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>> send an email to neo4j+un...@googlegroups.com.
>>>>>>
>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>
>>>>>
>>>>>  -- 
>>>> You received this message because you are subscribed to the Google 
>>>> Groups "Neo4j" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>> an email to neo4j+un...@googlegroups.com.
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>
>>>  -- 
>> You received this message because you are subscribed to the Google Groups 
>> "Neo4j" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to neo4j+un...@googlegroups.com <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Neo4j" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to neo4j+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to