ThinkGeo.com    |     Documentation    |     Premium Support

Problems Attempting to Combine MVC Mapping with Geocoding

I am in the process of evaluating the Map Suite MVC Edition and Geocoder.  I am attempting to recreate the quick start demo for the Geocoder located here using an MVC Web Project with an OpenStreetMap layer as the base layer.  I have encountered a problem in that the marker for 1701 Thome Ave is being placed in Lake Michigan. I believe the geocoding to be working correctly, but something is obviously wrong when I go to place the marker on the map. I have several questions.



1. First, the marker on the map is not drawn until I either zoom in or out. Why is this? I am making an explicit call to the redrawLayer function of the map. The following .js are attached to a button to initiate the geocoding process serverside and update the page with the response:




function Geocode() {
    var address = $("#idAddressBox").val();
    var param = { address: address };
    Map.ajaxCallAction(‘Home’‘Geocode’, param, callback);
};
 
function callback(result) {
    var resultString = result.get_responseData();
    if (resultString != “”) {
        $("#idResultsArea").val(resultString);
    }
    Map.redrawLayer(“MarkerLayer”);
};



2. When an InMemoryFeatureLayer is created, what is the default projection used? I think I read somewhere in the forums that an InMemoryFeatureLayer uses the same projection as the base overlay, though I may be remembering incorrectly.



3. The result from geocoding returns a centroid point defined: [CentroidPoint, POINT(-87.671919 41.9956200000006)] which is used to place the marker on the map using an InMemoryFeatureLayer.  The coordinates are obviously geodetic. Currently I am using a custom function to convert the returned geodetic coordinates into spherical mercator, and then using those to create a PointShape which I then use to add a new feature into the InMemoryFeatureLayer. Is there no functionality to do this built in, or does there exist a means of doing this without having to manually convert the coordinates?  The normal means of handling projection changes using the Proj4Projection class, say between OSM and a NAD83 shapefile would seem not to apply in this situation.

Hi Michael,



Thanks for evaluating our products!

As for your questions, I think  it is a projection issue. Here is my understandings and answers for them, please let me know if you have any questions.



In your case, as you are using OpenStreetMap as the base layer, the default projection should be under Mercator projection with meter(same layer like Bing,Google layers). But the geocoder result centroid is under EPSG 4326 with decimal degree. So, we should do a projection converter for the centroid marker. There are two ways to do the converter: 

1. Convert the marker coordinates directly and then add the projected marker into the layer.

2. Apply the projection converter on the layer and then add the original marker into the layer. In this way, all the markers will do a conversion with the converter before placing the marker on the map.

Here are some codes:


PointShape centroid = new PointShape(-55,45); // decimal degree
 
Proj4Projection proj4 = new Proj4Projection();
proj4.InternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(4326);
proj4.ExternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(900913);
proj4.Open();
 
// option 1
PointShape projectedCentroid = proj4.ConvertToExternalProjection(centroid) as PointShape;
inMemoryLayer.InternalFeatures.Add(new Feature(projectedCentroid));
// option 2
inMemoryLayer.FeatureSource.Projection = proj4;
inMemoryLayer.InternalFeatures.Add(new Feature(centroid));

For " When an InMemoryFeatureLayer is created, what is the default projection used? ", yes, we can think it is the same with the base layer.



Hope my explain is clear, but if you still have the issue, it is better you can attache any codes or sample.

Thanks,

Troy