Salting function sucks at creating edges
Our salting function salt_long_lines isn't working properly as noted by @rbanick. I've looked into this and will commit some changes to fix it.
-
Nodes are salted correctly, but long edges are dropped in the resulting graph, which means that "salted" edges are not being created correctly. The part of the script that re-adds salted edges is in a try statement, so errors in the edge creation / data attribution are not being captured.
-
The function is also projecting every edge one by one. Fixing that will make it run a lot quicker.
On a related note, I was testing this with a graph with edges that contained lists [] in their wkt attribute. This is a product of the clean network function. Adding rectify geometry after the second custom_simplify should fix this.
Better AND faster? My hero!
i pushed some changes, let me know if it fails https://github.com/worldbank/GOSTnets/commit/b54d645499bb9227d474b1f16d20d12b84fd2b72
I'm now getting the following error when I run gn.salt_long_lines:
TypeError Traceback (most recent call last)
<ipython-input-30-0711ec240991> in <module>
6 thresh = 500,
7 factor = 1000,
----> 8 attr_list = ['infra_type','osm_id','Type','iri'])
~\.conda\envs\test\lib\site-packages\gostnets-1.0.1-py3.6.egg\GOSTnets\core.py in salt_long_lines(G, source, target, thresh, factor, attr_list)
1539
1540 G2 = G.copy()
-> 1541 edges = edge_gdf_from_graph(G2, geometry_tag = 'Wkt')
1542 edges_projected = edges.to_crs(target)
1543 nodes_projected = node_gdf_from_graph(G).to_crs(target).set_index('node_ID')
~\.conda\envs\test\lib\site-packages\gostnets-1.0.1-py3.6.egg\GOSTnets\core.py in edge_gdf_from_graph(G, crs, attr_list, geometry_tag, xCol, yCol)
276 edges_df = edges_df[['stnode','endnode',*attr_list,geometry_tag]]
277 if type(edges_df.iloc[0][geometry_tag]) == str:
--> 278 edges_df[geometry_tag] = edges_df[geometry_tag].apply(loads)
279 edges_gdf = gpd.GeoDataFrame(edges_df, geometry = geometry_tag, crs = crs)
280
~\.conda\envs\test\lib\site-packages\pandas\core\series.py in apply(self, func, convert_dtype, args, **kwds)
3846 else:
3847 values = self.astype(object).values
-> 3848 mapped = lib.map_infer(values, f, convert=convert_dtype)
3849
3850 if len(mapped) and isinstance(mapped[0], Series):
pandas\_libs\lib.pyx in pandas._libs.lib.map_infer()
~\.conda\envs\test\lib\site-packages\shapely\wkt.py in loads(data)
8 def loads(data):
9 """Load a geometry from a WKT string."""
---> 10 return geos.WKTReader(geos.lgeos).read(data)
11
12 def load(fp):
~\.conda\envs\test\lib\site-packages\shapely\geos.py in read(self, text)
277 """Returns geometry from WKT"""
278 if not isinstance(text, text_types):
--> 279 raise TypeError("Only str is accepted.")
280 if sys.version_info[0] >= 3:
281 text = text.encode()
TypeError: Only str is accepted.
This is after loading in and running gn.clean_network on the latest Bangladesh OSM data, filtered to Cox's Bazar.
ahh, i thought i had tested this. I made a small change, try now
It ran for a while, much longer than before, saying...
Identified 5738 unique edge(s) longer than 500.
Beginning new node creation...
Then it kicked out this error:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-7-0711ec240991> in <module>
6 thresh = 500,
7 factor = 1000,
----> 8 attr_list = ['infra_type','osm_id','Type','iri'])
~\.conda\envs\test\lib\site-packages\gostnets-1.0.1-py3.6.egg\GOSTnets\core.py in salt_long_lines(G, source, target, thresh, factor, attr_list)
1640 result = cut(geom_to_split, (thresh))
1641
-> 1642 t_geom = transform(project_UTM_WGS, result[0])
1643
1644 edge_data = {'Wkt' : t_geom,
TypeError: 'NoneType' object is not subscriptable