Hi Craig, This is awesome!
Where is the update method? I can't find the code on github. Thanks! On Sat, Jul 2, 2011 at 6:00 PM, Craig Taverner <cr...@amanzi.com> wrote: > As I understand it, Andreas is working on the much more complex problem of > updating OSM geometries. That is more complex because it involves > restructuring the connected graph. > > The case Boris has is much simpler, just modifying the WKT or WKB in the > editable layer. In the Java API this is simply to call the > GeometryEncoder.encodeGeometry() method, which will modify the geometry in > place (ie. replace the old geometry with a new one). However, I do not > think > it is that simple on the REST interface. I can check, but think we will > need > a new method for updating geometries. Internally it is trivial to code. > > So I just added a quick method, called updateGeometryFromWKT, which > requires > the geometry (in WKT), the existing geometry node-id, and the layer. Give > it > a try. > > On Sat, Jul 2, 2011 at 5:10 PM, Peter Neubauer <neubauer.pe...@gmail.com > >wrote: > > > Actually, > > Andreas Wilhelm is working right now on updating geometries. > > > > Sent from my phone. > > On Jul 2, 2011 5:00 PM, "Boris Kizelshteyn" <bo...@popcha.com> wrote: > > > Wow that's great! I'll try it out asap. This leads to my next question: > > how > > > do I update the geometry in a layer, rather than add new? What I am > > thinking > > > of doing is having a multipoint geometery associated with each of my > user > > > nodes which will represent their location history. My plan is to add > the > > > geometry to a "world" layer and then associate the returned node with > the > > > user. How do I then add new points to that connecter node? Can I just > > edit > > > the wkt and assume the index will update? Or do you have a better > > suggestion > > > for doing this? I would rather avoid having each point be a seperate > node > > as > > > I am tracking gps data and getting lots of coordinates, it would be > many > > > thousands of nodes per user. > > > > > > Many thanks! > > > > > >> > > >> > > >> On Sat, Jul 2, 2011 at 6:48 AM, Craig Taverner <cr...@amanzi.com> > > wrote: > > >> > > >>> Hi Boris, > > >>> > > >>> Ah! You are using the REST API. That changes a lot, since Neo4j > Spatial > > is > > >>> only recently exposed in REST and we do not expose most of the > > >>> capabilities > > >>> I have discussed in this thread, or indeed in my other answer today. > > >>> > > >>> I did recently add some REST methods that might work for you, > > specifically > > >>> the addEditableLayer, which makes a WKB layer, and the > > >>> addGeometryWKTToLayer, for adding any kind of Geometry (including > > >>> LineString) to the layer. However, these were only added recently, > and > > I > > >>> have no experience using them myself, so consider this very much > > prototype > > >>> code. From your other question today, can I assume you are having > > trouble > > >>> making sense of the data coming back? So we need a better way to > return > > >>> the > > >>> results in WKT instead of WKB? One option would be to enhance the > > >>> addEditableLayer method to allow the creation of WKT layers instead > of > > WKB > > >>> layers, so the internal representation is more internet friendly. > > >>> > > >>> I've just added untested support for setting the format to WKT for > the > > >>> internal representation of the editable layer in the REST interface. > > This > > >>> is > > >>> untested (outside of my usual unit tests, that is), and is only in > the > > >>> trunk > > >>> of neo4j-spatial, but you are welcome to try it out and see what > > happens. > > >>> > > >>> Regards, Craig > > >>> > > >>> On Fri, Jul 1, 2011 at 5:29 PM, Boris Kizelshteyn <bo...@popcha.com> > > >>> wrote: > > >>> > > >>> > Hi Craig, > > >>> > > > >>> > Thanks so much for this reply. It is very insightful. Is it > possible > > for > > >>> me > > >>> > to implement the LineString geometries and lookups using REST? > > >>> > > > >>> > Many thanks! > > >>> > > > >>> > On Wed, Jun 8, 2011 at 4:58 PM, Craig Taverner <cr...@amanzi.com> > > >>> wrote: > > >>> > > > >>> > > OK. I understand much better what you want now. > > >>> > > > > >>> > > Your person nodes are not geographic objects, they are persons > that > > >>> can > > >>> > be > > >>> > > at many positions and indeed move around. However, the 'path' > that > > >>> they > > >>> > > take > > >>> > > is a geographic object and can be placed on the map and analysed > > >>> > > geographically. > > >>> > > > > >>> > > So the question I have is how do you store the path the person > > takes? > > >>> Is > > >>> > > this a bunch of position nodes connected back to that person? Or > > >>> perhaps > > >>> > a > > >>> > > chain of position-(next)->position-(next)->position, etc? However > > you > > >>> > have > > >>> > > stored this in the graph, you can express this as a geographic > > object > > >>> by > > >>> > > implementing the GeometryEncoder interface. See, for example, the > 6 > > >>> lines > > >>> > > of > > >>> > > code it takes to traverse a chain of NEXT locations and produce a > > >>> > > LineString > > >>> > > geometry in the SimpleGraphEncoder at > > >>> > > > > >>> > > > > >>> > > > >>> > > > > > https://github.com/neo4j/neo4j-spatial/blob/master/src/main/java/org/neo4j/gis/spatial/encoders/SimpleGraphEncoder.java#L82 > > >>> > > > > >>> > > < > > >>> > > > > >>> > > > >>> > > > > > https://github.com/neo4j/neo4j-spatial/blob/master/src/main/java/org/neo4j/gis/spatial/encoders/SimpleGraphEncoder.java#L82 > > >>> > > >If > > >>> > > you do this, you can create a layer that uses your own geometry > > >>> encoder > > >>> > (or > > >>> > > the SimpleGraphEncoder I referenced above, if you use the same > > graph > > >>> > > structure) and your own domain model will be expressed as > > LineString > > >>> > > geometries and you can perform spatial operations on them. > > >>> > > > > >>> > > Alternatively, if your data is more static in nature, and you are > > >>> > analysing > > >>> > > only what the person did in the past, and the graph will therefor > > not > > >>> > > change, perhaps you do not care to store the locations in the > > graph, > > >>> and > > >>> > > you > > >>> > > can just import them as a LineString directly into a standard > > layer. > > >>> > > > > >>> > > Whatever route you take, the final action you want to perform is > to > > >>> find > > >>> > > points near the LineString (path the person took). I do not think > > the > > >>> > > bounding box is the right approach for that either. You need to > > try, > > >>> for > > >>> > > example, the method findClosestEdges in the utilities class at > > >>> > > > > >>> > > > > >>> > > > >>> > > > > > https://github.com/neo4j/neo4j-spatial/blob/master/src/main/java/org/neo4j/gis/spatial/SpatialTopologyUtils.java#L115 > > >>> > > > > >>> > > < > > >>> > > > > >>> > > > >>> > > > > > https://github.com/neo4j/neo4j-spatial/blob/master/src/main/java/org/neo4j/gis/spatial/SpatialTopologyUtils.java#L115 > > >>> > > >This > > >>> > > method can find the part of the persons path that it closest to > the > > >>> point > > >>> > > of > > >>> > > interest. There also also many other geographic operations you > > might > > >>> be > > >>> > > interested in trying, once you have a better feel for the types > of > > >>> > queries > > >>> > > you want to ask. > > >>> > > > > >>> > > Regards, Craig > > >>> > > > > >>> > > On Wed, Jun 8, 2011 at 2:17 AM, Boris Kizelshteyn < > > bo...@popcha.com> > > >>> > > wrote: > > >>> > > > > >>> > > > Thanks for the detailed response! Here is what I'm trying to do > > and > > >>> I'm > > >>> > > > still not sure how to accomplish it: > > >>> > > > > > >>> > > > 1. I have a node which is a person > > >>> > > > > > >>> > > > 2. I have geo data as that person moves around the world > > >>> > > > > > >>> > > > 3. I use the geodata to create a bounding box of where that > > person > > >>> has > > >>> > > been > > >>> > > > today > > >>> > > > > > >>> > > > 4. I want to say, was this person A near location X today? > > >>> > > > > > >>> > > > 5. I do this by seeing if location X is in A's bounding box. > > >>> > > > > > >>> > > > From looking at what you suggest doing, it's not clear how I > > assign > > >>> the > > >>> > > > node > > >>> > > > person A to a layer? Is it that the bounding box is now in the > > layer > > >>> > and > > >>> > > > not > > >>> > > > in the node? The issue then becomes, how od I associate the two > > as > > >>> the > > >>> > > > RTree > > >>> > > > relationship seems to establish itself on the bounding box > > between > > >>> the > > >>> > > node > > >>> > > > and the layer. > > >>> > > > > > >>> > > > Many thanks for your patience as I learn this challenging > > material. > > >>> > > > > > >>> > > > On Tue, Jun 7, 2011 at 4:13 PM, Craig Taverner < > cr...@amanzi.com > > > > > >>> > wrote: > > >>> > > > > > >>> > > > > I think you need to differentiate the bounding boxes of the > > data > > >>> in > > >>> > the > > >>> > > > > layer (stored in the database), and the bounding box of the > > search > > >>> > > query. > > >>> > > > > The search query is not stored in the database, and will not > be > > >>> seen > > >>> > as > > >>> > > a > > >>> > > > > node or nodes in the database. So if you want to search for > > data > > >>> > within > > >>> > > > > some > > >>> > > > > bounding box or polygon, then express that in the search > query, > > >>> and > > >>> > you > > >>> > > > do > > >>> > > > > not need to care about how your nodes are stored in the > > database. > > >>> > > > > > > >>> > > > > So when you say you want to make a larger bounding box, I > > assume > > >>> you > > >>> > > are > > >>> > > > > talking about the query itself. The REST API has the method > > >>> > > > > findGeometriesInLayer, which takes minx, maxx, miny, maxy > > >>> parameters > > >>> > > and > > >>> > > > > you > > >>> > > > > can set those to whatever you want for your query. > > >>> > > > > > > >>> > > > > The REST API also exposes the CQL query language supported by > > >>> > GeoTools. > > >>> > > > > This > > >>> > > > > allows you to perform SQL-like queries on geometries and > > feature > > >>> > > > > attributes. > > >>> > > > > For example, you can search for all objects within a specific > > >>> polygon > > >>> > > > (not > > >>> > > > > just a rectangular bounding box), as well as conforming to > > certain > > >>> > > > > attributes. See > > >>> > > > > > > >>> > > > > > >>> > > > > >>> > > > >>> > > > http://docs.geoserver.org/latest/en/user/tutorials/cql/cql_tutorial.htmlfor > > >>> > > > > some examples of CQL. > > >>> > > > > > > >>> > > > > However, our current CQL support is not fully integrated with > > the > > >>> > RTree > > >>> > > > > index. This means that the CQL itself will not benefit from > the > > >>> > index, > > >>> > > > but > > >>> > > > > be a raw search. You can, however, still get the benefit of > the > > >>> index > > >>> > > by > > >>> > > > > passing in the bounding box separately. So, for example, you > > want > > >>> to > > >>> > > > search > > >>> > > > > for data in a polygon. Make the polygon object, get it's > > bounding > > >>> box > > >>> > > and > > >>> > > > > also the CQL query string. Then make a 'dynamic layer' using > > the > > >>> CQL > > >>> > > > (which > > >>> > > > > is a bit like making a prepared statement). Then perform the > > same > > >>> > > > > 'findGeometriesInLayer' method mentioned above, using the > > bounding > > >>> > box > > >>> > > > and > > >>> > > > > the dynamic layer (containing the CQL). This has the effect > of > > >>> using > > >>> > > the > > >>> > > > > RTree index for a first approximate search, followed by pure > > CQL > > >>> for > > >>> > > the > > >>> > > > > final mile. > > >>> > > > > > > >>> > > > > See examples of this in action in the Unit tests in the > source > > >>> code. > > >>> > > > > > > >>> > > > > > > >>> > > > > > >>> > > > > >>> > > > >>> > > > > > https://github.com/neo4j/neo4j-spatial/blob/master/src/test/java/org/neo4j/gis/spatial/ServerPluginTest.java#L109 > > >>> > > > > has > > >>> > > > > examples of CQL queries on the REST API. > > >>> > > > > > > >>> > > > > On Tue, Jun 7, 2011 at 5:48 PM, Boris Kizelshteyn < > > >>> bo...@popcha.com> > > >>> > > > > wrote: > > >>> > > > > > > >>> > > > > > Thanks! So it seems you are saying that the bounding box > > >>> represents > > >>> > a > > >>> > > > > > single > > >>> > > > > > point and is the same as the lat/lat lon? What if I make > the > > >>> > bounding > > >>> > > > box > > >>> > > > > > bigger? What I am trying to do is geo queries against a > > bounding > > >>> > box > > >>> > > > made > > >>> > > > > > of > > >>> > > > > > a set of points, rather than individual points. So the > query > > is, > > >>> > find > > >>> > > > the > > >>> > > > > > nodes where the given point falls inside their bounding > > boxes. > > >>> Can > > >>> > I > > >>> > > do > > >>> > > > > > this > > >>> > > > > > with REST? > > >>> > > > > > > > >>> > > > > > Thanks! > > >>> > > > > > > > >>> > > > > > On Tue, Jun 7, 2011 at 11:34 AM, Craig Taverner < > > >>> cr...@amanzi.com> > > >>> > > > > wrote: > > >>> > > > > > > > >>> > > > > > > Hi, > > >>> > > > > > > > > >>> > > > > > > The bounding boxes are used by the RTree index, which is > a > > >>> > typical > > >>> > > > way > > >>> > > > > to > > >>> > > > > > > index spatial data. For Point data, the lat/long and the > > >>> bounding > > >>> > > box > > >>> > > > > are > > >>> > > > > > > the same thing, but for other shapes (streets/LineString > > and > > >>> > > > Polygons), > > >>> > > > > > the > > >>> > > > > > > bounding box is quite different to the actual geometry > > (which > > >>> is > > >>> > > not > > >>> > > > > just > > >>> > > > > > a > > >>> > > > > > > single lat/long, but a set of connected points forming a > > >>> complex > > >>> > > > > shape). > > >>> > > > > > > > > >>> > > > > > > The RTree does not differentiate between points and other > > >>> > > geometries, > > >>> > > > > > > because it cares only about the bounding box, and > therefor > > we > > >>> > > provide > > >>> > > > > > that > > >>> > > > > > > even for something as simple as a Point. > > >>> > > > > > > > > >>> > > > > > > Does that answer the question? > > >>> > > > > > > > > >>> > > > > > > Regards, Craig > > >>> > > > > > > > > >>> > > > > > > On Tue, Jun 7, 2011 at 4:57 PM, Boris Kizelshteyn < > > >>> > > bo...@popcha.com> > > >>> > > > > > > wrote: > > >>> > > > > > > > > >>> > > > > > > > Greetings! > > >>> > > > > > > > > > >>> > > > > > > > Perhaps someone using neo4j-spatial can answer this > > >>> seemingly > > >>> > > > simple > > >>> > > > > > > > question. Nodes classified into layers have both > lat/lon > > >>> > > properties > > >>> > > > > and > > >>> > > > > > > > bounding boxes, the bounding box seems to be required > to > > >>> > > establish > > >>> > > > > the > > >>> > > > > > > > relationship between node and layer, however the node > is > > not > > >>> > > found > > >>> > > > if > > >>> > > > > > the > > >>> > > > > > > > lat/lon does not match the query. Can someone explain > the > > >>> > > > > relationship > > >>> > > > > > > > between these two properties on a node? > > >>> > > > > > > > > > >>> > > > > > > > Many thanks! > > >>> > > > > > > > _______________________________________________ > > >>> > > > > > > > Neo4j mailing list > > >>> > > > > > > > User@lists.neo4j.org > > >>> > > > > > > > https://lists.neo4j.org/mailman/listinfo/user > > >>> > > > > > > > > > >>> > > > > > > _______________________________________________ > > >>> > > > > > > Neo4j mailing list > > >>> > > > > > > User@lists.neo4j.org > > >>> > > > > > > https://lists.neo4j.org/mailman/listinfo/user > > >>> > > > > > > > > >>> > > > > > _______________________________________________ > > >>> > > > > > Neo4j mailing list > > >>> > > > > > User@lists.neo4j.org > > >>> > > > > > https://lists.neo4j.org/mailman/listinfo/user > > >>> > > > > > > > >>> > > > > _______________________________________________ > > >>> > > > > Neo4j mailing list > > >>> > > > > User@lists.neo4j.org > > >>> > > > > > > >>> > > > > > > >>> > > > _______________________________________________ > > >>> > > > Neo4j mailing list > > >>> > > > User@lists.neo4j.org > > >>> > > > https://lists.neo4j.org/mailman/listinfo/user > > >>> > > > > > >>> > > _______________________________________________ > > >>> > > Neo4j mailing list > > >>> > > User@lists.neo4j.org > > >>> > > https://lists.neo4j.org/mailman/listinfo/user > > >>> > > > > >>> > _______________________________________________ > > >>> > Neo4j mailing list > > >>> > User@lists.neo4j.org > > >>> > https://lists.neo4j.org/mailman/listinfo/user > > >>> > > > >>> _______________________________________________ > > >>> Neo4j mailing list > > >>> User@lists.neo4j.org > > >>> https://lists.neo4j.org/mailman/listinfo/user > > >>> > > >> > > > _______________________________________________ > > > Neo4j mailing list > > > User@lists.neo4j.org > > > https://lists.neo4j.org/mailman/listinfo/user > > _______________________________________________ > > Neo4j mailing list > > User@lists.neo4j.org > > https://lists.neo4j.org/mailman/listinfo/user > > > _______________________________________________ > Neo4j mailing list > User@lists.neo4j.org > https://lists.neo4j.org/mailman/listinfo/user > _______________________________________________ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user