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

Reply via email to