Hi Boris,

I can see the new update method here:
https://github.com/neo4j/neo4j-spatial/blob/master/src/main/java/org/neo4j/gis/spatial/server/plugin/SpatialPlugin.java#L138

And the commit for it is here:
https://github.com/neo4j/neo4j-spatial/commit/22eaf91957a6265ef1e6923b5da572b75383b83e

Hope that helps.

Let me know if this works. The REST method is entirely untested, but does
wrap code that is tested, so I'm relatively optimistic :-)

Regards, Craig

On Wed, Jul 6, 2011 at 1:51 AM, Boris Kizelshteyn <bo...@popcha.com> wrote:

> 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
>
_______________________________________________
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user

Reply via email to