Mmh, you are looking not for the next node on a way but the nearest? In that case, you maybe coudl index all OSM nodes in a new layer "ALL_NODES", then fish out the next node on the way, and do a search for nodes closer that this and check if they are on your way?
Cheers, /peter neubauer GTalk: neubauer.peter Skype peter.neubauer Phone +46 704 106975 LinkedIn http://www.linkedin.com/in/neubauer Twitter http://twitter.com/peterneubauer http://www.neo4j.org - Your high performance graph database. http://startupbootcamp.org/ - Öresund - Innovation happens HERE. http://www.thoughtmade.com - Scandinavia's coolest Bring-a-Thing party. On Fri, Jul 22, 2011 at 5:45 PM, Nolan Darilek <no...@thewordnerd.info> wrote: > OK, thanks for this. Unfortunately my project is getting less attention > now than it ever has, but I finally sat down and reworked my > architecture. Instead of working with Neo4J Nodes, I've reworked my > library to use SpatialDatabaseRecord and am now having a bit more success. > > I have three more query types to implement, and I'm not immediately > seeing how to do this using the OSM API. I'm not sure if I need to drop > to the lower-level JTS searches for these, so any guidance would be > appreciated. Note that, in all that follows, "node" means OSM node, not > Neo4J node: > > def nearestWay(lat:Double, lon:Double, > allowedTypes:Option[List[String]] = None) = { > > Finds the nearest way to a given lat, lon. The list of allowed types > lets me filter out power lines, footways, etc. by specifying values for > the highway= tag. > > def nearestNodeWithWay(lat:Double, lon:Double, > allowedTypes:Option[List[String]]) = { > > Finds the nearest node on any way. > > def waysForNode(n:Node) = { > > Lists the ways on which a given node is found. OSMDataset lets me do the > opposite and returns the nodes for a way, but I don't immediately see a > way to do this. > > Thanks. > > > On 06/19/2011 04:47 PM, Craig Taverner wrote: >> Hi Nolan, >> >> I think I can answer a few of your questions. Firstly, some background. The >> graph model of the OSM data is based largely on the XML formated OSM >> documents, and there you will find 'nodes', 'ways', 'relations' and 'tags' >> each as their own xml-tag, and as a consequence each will also have their >> own neo4j-node in the graph. Another point is that the geometry can be based >> on one or more nodes or ways, and so we always create another node for the >> geometry, and link it to the osm-node, way or relation that represents that >> geometry. >> >> What all this boils down to is that you cannot find the tags on the geometry >> node itself. You cannot even find the location on that node. If you want to >> use the graph model in a direct way, as you have been trying, you really do >> need to know how the OSM data is modeled. For example, for a LineString >> geometry, you would need to traverse from the geometry node to the way node >> and finally to the tags node (to get the tags). To get to the locations is >> even more complex. Rather than do that, I would suggest that you work with >> the OSM API we provided with the OSMLayer, OSMDataset and OSMGeometryEncoder >> classes. Then you do not need to know the graph model at all. >> >> For example, OSMDataset has a method for getting a Way object from a node, >> and the returned object can be queried for its nodes, geometry, etc. >> Currently we provide methods for returning neo4j-nodes as well as objects >> that make spatial sense. One minor issue here is the ambiguity inherent in >> the fact that both neo4j and OSM make use of the term 'node', but for >> different things. We have various solutions to this, sometimes replacing >> 'node' with 'point' and sometimes prefixing with 'osm'. The unit tests in >> TestsForDocs includes some tests for the OSM API. >> >> My first goal is to find the nearest OSM node to a given lat, lon. My >>> attempts seem to be made of fail thus far, however. Here's my code: >>> >> Most of the OSM dataset is converted into LineStrings, and what you really >> want to do is find the closest vertex of the closest LineString. We have a >> utility function 'findClosestEdges' in the SpatialTopologyUtils class for >> that. The unit tests in TestSpatialUtils, and the testSnapping() method in >> particular, show use of this. >> >> My thinking is that nodes should be represented as points, so I can't >>> see why this fails. When I run this in a REPL, I do get a node back. So >>> far so good. Next, I want to get the node's tags. So I run: >>> >> The spatial search will return 'geometries', which are spatial objects. In >> neo4j-spatial every geometry is represented by a unique node, but it is not >> required that that node contain coordinates or tags. That is up to the >> GeometryEncoder. In the case of the OSM model, this information is >> elsewhere, because of the nature of the OSM graph, which is a highly >> interconnected network of points, most of which do not represent Point >> geometries, but are part of much more complex geometries (streets, regions, >> buildings, etc.). >> >> n.getSingleRelationship(OSMRelation.TAGS, Direction.INCOMING) >> The geometry node is not connected directly to the tags node. You need two >> steps to get there. But again, rather than figure out the graph yourself, >> use the API. In this case, instead of getting the geometry node from the >> SpatialDatabaseRecord, rather just get the properties using getPropertyNames >> and getProperty(String). This API works the same on all kinds of spatial >> data, and in the case of OSM data will return the TAGS, since those are >> interpreted as attributes of the geometries. >> >> n.getSingleRelationship(OSMRelationship.GEOM, >>> Direction.INCOMING).getOtherNode(n).getPropertyKeys >>> I see what appears to be a series of tags (oneway, name, etc.) Why are >>> these being returned for OSMRelation.GEOM rather than OSMRelation.TAGS? >>> >> These are not the tags. Now you have found the node representing an OSM >> 'Way'. This has a few properties on it that are relevant to the way, the >> name, whether the street is oneway or not, etc. Sometimes these are based on >> values in the tags, but they are not the tags themselves. This node is >> connected to the geometry node and the tags node, so you were half-way there >> (to the tags that is). You started at the geometry node, and stepped over to >> the way node, and one more step (this time with the TAGS relationship) would >> have got you to the tags. >> >> But again, I advise against trying to explore the OSM graph by itself. As >> you have already found, it is not completely trivial. What you should have >> done is access the attributes directly from the search results. >> >> Additionally, I see the property way_osm_id, which clearly isn't a tag. >>> It would also seem to indicate that this query returned a way rather >>> than a node like I'd hoped. This conclusion is further born out by the >>> tag names. So clearly I'm not getting the search correct. But beyond >>> that, the way being returned by this search isn't close to the lat,lon I >>> provided. What am I missing? >>> >> The lat/long values are quite a bit deeper in the graph. In the case of >> 'ways', we have a chain of nodes that run from the first to the last node of >> the way. Each of these nodes has a relationship to another node that >> contains the location. The reason for the intermediate nodes is because the >> location nodes can exist in multiple ways. Needless to say it is a bit >> complex to traverse all this completely manually as you are trying. >> >> Another complication is that most points in the OSM model are not exposed as >> Point Geometries in the spatial index. This is because most of them are >> intended as parts of bigger geometries. For example, if someone created a >> lake in OSM, made of 100 points in a polygon, those 100 points would not be >> indexed in the spatial index, but the Polygon would be. So using the spatial >> index to find points like this will not work. Only points that are tagged >> individually will appear in the spatial index. We have some rules in the >> importer to decide if points that are part of bigger geometries can also be >> indexed by themselves. Usually the presence of user tags is good enough for >> this. Needless to say, very few points have their own tags, but the ways >> they belong to will have tags. >> >> So it you are interested in only points of interest, then using the index to >> search for points will work. If you are interested in all OSM nodes, >> including those that are only vertices of ways, then use the >> SpatialTopologyUtils.findClosestEdges(Point,Layer) method. >> >> As an aside, in looking at the latest OSM import testcase, it seems like >>> the batch inserter may now be optional. Is this true, and what >>> benefits/disadvantages are there to its use? I tried importing the Texas >>> OSM data on my fairly powerful laptop, but gave up after 12 hours and >>> 170000 way imports (I think there are over a million in that dataset.) >>> Other geospatial formats seem to do the import in a matter of hours, but >>> this import seemed like it'd go on for days if I let it. >>> >> There is a problem with the lucene index. Well, not specifically lucene, but >> a problem with using a general purpose index to map between OSM-ways and >> OSM-nodes. This problem really affects the scalability of the importer. It >> certainly slows down a lot for larger datasets. We have investigated various >> other solutions. Peter has tried BDB and other external indexes, and I >> started writing a HashMap/Array based index. I did not finish that, but have >> seen that Chris Gioran has now started a similar (and apparently more >> complete / better) solution at https://github.com/digitalstain/BigDataImport. >> I would like to try it out when I get a chance. The issue we have scaling >> the OSM import is not unique, so a solution like this will probably help >> many people. >> _______________________________________________ >> 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