ThinkGeo.com    |     Documentation    |     Premium Support

Geocoding Intersections

I am new to the process of geocoding with ThinkGeo. I am able to geocode based on a specific/fuzzy address using the sample data without a problem. I have not been able to input an intersection or cross street and have a geocoded result.


How do I geocode based on intersections/cross streets?



David, 
  
 I’m sorry to tell you currently we don’t support the intersection geocoding, we are researching this section and prepare to integrate it into the next final release. 
  
 Thanks, 
  
 Scott,

Scott, 
  
 Thank you. I’m glad to see that it is in the works. Is it possible to get a shape/line/feature (don’t know the correct term) for the entirety of a street? If so, I may be able to find my points that way. 
  
 Thanks, 
 David

I can show an example of how to get the shape from a street Layer (a shapefile) and also how to get the end points that are candidates for being intersection points. As you can see in the screenshot, we get the two end points of the street when only one is an intersection point. We will have the full logic for that implemented in the Geocoder product but for now I think that you can get something going with what I show you.




 winformsMap1.MapUnit = GeographyUnit.DecimalDegree;
            winformsMap1.CurrentExtent = new RectangleShape(-97.7487,30.274,-97.7343,30.2658);
            winformsMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.FromArgb(255, 198, 255, 255));

            ShapeFileFeatureLayer streetLayer = new ShapeFileFeatureLayer(@"..\..\Data\austinstreets.shp");
            streetLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.LocalRoad2;
            streetLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

            LayerOverlay staticOverlay = new LayerOverlay();   
            staticOverlay.Layers.Add("StreetLayer", streetLayer);   
            winformsMap1.Overlays.Add(staticOverlay);

            streetLayer.Open();
            Collection<Feature> features = streetLayer.FeatureSource.GetFeaturesByColumnValue("RECID", "12503");
            streetLayer.Close();

            MultilineShape multiLineShape = features[0].GetShape() as MultilineShape;

            InMemoryFeatureLayer streetInMemoryFeatureLayer = new InMemoryFeatureLayer();
            streetInMemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.CreateSimpleLineStyle(GeoColor.StandardColors.LightPink, 3,true);
            streetInMemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = PointStyles.CreateSimplePointStyle(PointSymbolType.Circle, GeoColor.StandardColors.Red, 12);
            streetInMemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

            streetInMemoryFeatureLayer.Open();
            streetInMemoryFeatureLayer.EditTools.BeginTransaction();
            streetInMemoryFeatureLayer.EditTools.Add(new Feature(multiLineShape));
            streetInMemoryFeatureLayer.EditTools.Add(new Feature(GetEndPoints(multiLineShape)));
            streetInMemoryFeatureLayer.EditTools.CommitTransaction();
            streetInMemoryFeatureLayer.Close();
           

            LayerOverlay intersectionOverlay = new LayerOverlay();
            intersectionOverlay.Layers.Add("Street", streetInMemoryFeatureLayer);
            winformsMap1.Overlays.Add(intersectionOverlay);

            winformsMap1.Refresh();

 private MultipointShape GetEndPoints(MultilineShape multilineShape)
        {
            MultipointShape multipointShape = new MultipointShape();

            foreach (LineShape lineShape in multilineShape.Lines)
            {
                multipointShape.Points.Add(new PointShape(lineShape.Vertices[0]));
                multipointShape.Points.Add(new PointShape(lineShape.Vertices[lineShape.Vertices.Count -1]));
            }
            return multipointShape;
        }


Val, 
  
 Thank you so much! This is extremely helpful. I really appreciate this. You have shown me the way and I think I can make it work from here. 
  
 Thanks again! 
 David

You are welcome. If you run into any difficulties with the algorithm to find the specific intersection point of streets, let us know.

Using your example I am able to visualize the intersections in 2 InMemoryFeatureLayers. I don’t know enough about MapSuite to understand how I can find the intersection of these lines/points. The methods I have been able to find that I think would work talk about Shape Files and I’m basically confused. I know the vertices are added as Features and my guess would be that I look for a TNODE or FNODE that occurs more than once, but I don’t know how to do that.  
  
 I also may be thinking in the completely wrong direction!

Ok, I understand that this is not the most intuitive thing to implement. This afternoon, I will post a Code Community project that shows how to get the exact intersection point based on two streets. I will let you know as soon as it is posted. Thank you for the idea.

There is a new project on Street Intersection in the Code Community. You can check it out:


code.thinkgeo.com/projects/show/streetintersection



Excellent work! This was exactly what I was looking for. Thank you.

David, 
  
 You are welcome, please if you still have any other questions please let us know, 
  
 Thanks,

Hi, 
  
 I was just curious if intersection GeoCoding made it in the 4.0 release yet? 
  
 Thanks, 
  
 .Ryan.

Ryan, 
  
 Thanks for your post, 
  
 We haven’t included the intersection Geocode in the 4.0 release yet, we prepare to add this new feature to it in the next release version.  
  
 Thanks, 
  
 Scott,

Hi Scott,


Did this make it in to 4.5?  I'm at the point where this is a requirement for me.  If not, is there a way I can write my own?  I've tried writing my own plugin which uses StreetMatchingPlugin to geocode the 2 street names, but it appears that StreetMatchingPlugin is actually looking for a house number and an address and no results are ever found when searching for just a street name.  Any help would be appreciated.


Thanks,


.Ryan.



Ryan, 
  
 Thanks for your post, 
  
 Currently, we don’t make it to 4.5 version, I think we can talk about your requirements first, can you tell me your test address and what’s result you want to return? So that I can look for a solution to re-write some function to resolve your requirement, 
  
 Thanks, 
  
 Scott,

Hi Scott,


Ideally I'd like to take an input such as "w 1st st and n hope st, los angeles, ca" and it would return to me information (at least the lat/long) about the location that those two streets cross.   Any more questions, feel free to ask.


.Ryan.



Ryan,



Currently we are working on the intersetion ability for MapSuiteGeocoder, if you would like to take an input and return to the intersection location I suggest you to reference the sample below: 


wiki.thinkgeo.com/wiki/File:ServicesEditionSample_StreetIntersection_CS_100121.zip


in this sample it will calculate the intersection location on the map.



Thanks,



Scott,



Hi Scott, 
  
 That sample is not going to help me much as I have many shapefiles representing roads.  Do you have any idea in the time frame we are looking at for getting intersections integrated into MapSuiteGeocoder? 
  
 Thanks, 
  
 .Ryan.

Ryan, 
  
 Thanks for your post, I would like to tell you that we are researching on the MapSuiteGeocoder intersections, this requires us to change the logic in the core code, currently, the MapSuiteGeocoder just search the inputs in the index file according to the binary search arithmetic, so it just returns all searched records according to the arithmetic.  
  
 Please keep your eyes on our site for the new ability of Geocoder, 
  
 Thanks, 
  
 Scott,