Get Latitude Longitude from an address c#
Asked Answered
Z

3

13

I am using a webservice from geocoder to get the lat and long from address, city and state. When I use the example below, i don't get the lat and long. Am I doing something wrong here.

Requested address: 1125 E. 102nd Street, Los Angeles, CA

Here is my code:

private void GetLatLongFromAddress(string street, string city, string state)
{
    string geocoderUri = string.Format(@"http://rpc.geocoder.us/service/rest?address={0},{1},{2}", street, city, state);
    XmlDocument geocoderXmlDoc = new XmlDocument();
    geocoderXmlDoc.Load(geocoderUri);
    XmlNamespaceManager nsMgr = new XmlNamespaceManager(geocoderXmlDoc.NameTable);
    nsMgr.AddNamespace("geo", @"http://www.w3.org/2003/01/geo/wgs84_pos#");
    string sLong = geocoderXmlDoc.DocumentElement.SelectSingleNode(@"//geo:long", nsMgr).InnerText;
    string sLat = geocoderXmlDoc.DocumentElement.SelectSingleNode(@"//geo:lat", nsMgr).InnerText;

    Latitude = Double.Parse(sLat);
    Longitude = Double.Parse(sLong);
}

The lat and long comes back with 0. I tried to add zip code too but that didn't work. Is there any better webservices that would give me the up to date results.

Thanks in advance.

Zygophyte answered 20/1, 2012 at 15:30 Comment(9)
Google maps does thisDropper
This isn't really a C# question. It is a question about a webservice.Bishopric
Please review your question. This is about a specific web service, not c#.Norvol
I tried your code GetLatLongFromAddress("1125 E. 102nd Street", "Los Angeles", "CA"); and it returned Latitude of 33.944015 and Latitude of -118.255818. How are you calling your method?Fed
This function works for me, returning the correct values. Maybe the issue is with your objects Latitude and Longitude? What are the values of sLong and sLat when you step through it?Meagan
When i am stepping through the code, I am getting an error when the xml document is loading. Data at the root level is invalid. Line 1, position 1.Zygophyte
It works now. I was missing the @ sign when declaring the uri. Thanks all for verifying the code.Zygophyte
@Zygophyte - i am getting the same error as you got . how can i solve it ? please help me.Maite
@Zygophyte - i have used your code. but i am getting the value of sLang as null and getting an error "Object reference not set to an instance of an object". waiting for reply.. : (Maite
F
5

I often use the Bing Maps Rest APIs. You can geo-code using requests like the following:

http://dev.virtualearth.net/REST/v1/Locations/CA/adminDistrict/postalCode/locality/addressLine?includeNeighborhood=includeNeighborhood&key=BingMapsKey

You can see it in use in a codeproject article I wrote on reactive extensions.

For example, your address:

http://dev.virtualearth.net/REST/v1/Locations/US/1125%20E.%20102nd%20Street,%20Los%20Angeles,%20CA?key=Ai9-KNy6Al-r_ueyLuLXFYB_GlPl-c-_iYtu16byW86qBx9uGbsdJpwvrP4ZUdgD

Gives the following response:

{
   "authenticationResultCode":"ValidCredentials",
   "brandLogoUri":"http:\/\/dev.virtualearth.net\/Branding\/logo_powered_by.png",
   "copyright":"Copyright © 2012 Microsoft and its suppliers. All rights reserved. This API cannot be accessed and the content and any results may not be used, reproduced or transmitted in any manner without express written permission from Microsoft Corporation.",
   "resourceSets":[
      {
         "estimatedTotal":1,
         "resources":[
            {
               "__type":"Location:http:\/\/schemas.microsoft.com\/search\/local\/ws\/rest\/v1",
               "bbox":[
                  33.940492293415652,
                  -118.26180800227225,
                  33.948217728557005,
                  -118.24939194889963
               ],
               "name":"1125 E 102ND St, Los Angeles, CA 90002",
               "point":{
                  "type":"Point",
                  "coordinates":[
                     33.944355010986328,
                     -118.25559997558594
                  ]
               },
               "address":{
                  "addressLine":"1125 E 102ND St",
                  "adminDistrict":"CA",
                  "adminDistrict2":"Los Angeles Co.",
                  "countryRegion":"United States",
                  "formattedAddress":"1125 E 102ND St, Los Angeles, CA 90002",
                  "locality":"Los Angeles",
                  "postalCode":"90002"
               },
               "confidence":"High",
               "entityType":"Address",
               "geocodePoints":[
                  {
                     "type":"Point",
                     "coordinates":[
                        33.944355010986328,
                        -118.25559997558594
                     ],
                     "calculationMethod":"Parcel",
                     "usageTypes":[
                        "Display"
                     ]
                  },
                  {
                     "type":"Point",
                     "coordinates":[
                        33.944118499755859,
                        -118.25559997558594
                     ],
                     "calculationMethod":"Interpolation",
                     "usageTypes":[
                        "Route"
                     ]
                  }
               ],
               "matchCodes":[
                  "Good"
               ]
            }
         ]
      }
   ],
   "statusCode":200,
   "statusDescription":"OK",
   "traceId":"81518ba504a3494bb0b62bdb6aa4b291|LTSM002104|02.00.83.500|LTSMSNVM001473, LTSMSNVM001463, LTSMSNVM001452, LTSMSNVM001851, LTSMSNVM001458, LTSMSNVM001462"
}

Or ... for XML data, add o=xml:

http://dev.virtualearth.net/REST/v1/Locations/US/1125%20E.%20102nd%20Street,%20Los%20Angeles,%20CA?o=xml&key=Ai9-KNy6Al-r_ueyLuLXFYB_GlPl-c-_iYtu16byW86qBx9uGbsdJpwvrP4ZUdgD

Which gives:

<Response>
  <Copyright>Copyright ? 2012 Microsoft and its suppliers. All rights reserved. This API cannot be accessed and the content and any results may not be used, reproduced or transmitted in any manner without express written permission from Microsoft Corporation.</Copyright>
  <BrandLogoUri>http://dev.virtualearth.net/Branding/logo_powered_by.png</BrandLogoUri>
  <StatusCode>200</StatusCode>
  <StatusDescription>OK</StatusDescription>
  <AuthenticationResultCode>ValidCredentials</AuthenticationResultCode>
  <TraceId>b9af8a6b058b455ca9c368b9e32142fe|LTSM002102|02.00.83.500|LTSMSNVM002001, LTSMSNVM001464, LTSMSNVM001451, LTSMSNVM001452, LTSMSNVM001457, LTSMSNVM002052, LTSMSNVM001461</TraceId>
  <ResourceSets>
    <ResourceSet>
      <EstimatedTotal>1</EstimatedTotal>
      <Resources>
        <Location>
          <Name>1125 E 102ND St, Los Angeles, CA 90002</Name>
          <Point>
            <Latitude>33.944355010986328</Latitude>
            <Longitude>-118.25559997558594</Longitude>
          </Point>
          <BoundingBox>
            <SouthLatitude>33.940492293415652</SouthLatitude>
            <WestLongitude>-118.26180800227225</WestLongitude>
            <NorthLatitude>33.948217728557005</NorthLatitude>
            <EastLongitude>-118.24939194889963</EastLongitude>
          </BoundingBox>
          <EntityType>Address</EntityType>
          <Address>
            <AddressLine>1125 E 102ND St</AddressLine>
            <AdminDistrict>CA</AdminDistrict>
            <AdminDistrict2>Los Angeles Co.</AdminDistrict2>
            <CountryRegion>United States</CountryRegion>
            <FormattedAddress>1125 E 102ND St, Los Angeles, CA 90002</FormattedAddress>
            <Locality>Los Angeles</Locality>
            <PostalCode>90002</PostalCode>
          </Address>
          <Confidence>High</Confidence>
          <MatchCode>Good</MatchCode>
          <GeocodePoint>
            <Latitude>33.944355010986328</Latitude>
            <Longitude>-118.25559997558594</Longitude>
            <CalculationMethod>Parcel</CalculationMethod>
            <UsageType>Display</UsageType>
          </GeocodePoint>
          <GeocodePoint>
            <Latitude>33.944118499755859</Latitude>
            <Longitude>-118.25559997558594</Longitude>
            <CalculationMethod>Interpolation</CalculationMethod>
            <UsageType>Route</UsageType>
          </GeocodePoint>
        </Location>
      </Resources>
    </ResourceSet>
  </ResourceSets>
</Response>

So the lat / long for your given address is (33.9, -118.2)

Fallen answered 20/1, 2012 at 15:42 Comment(0)
S
2

Google Maps has a web service API that returns lat/long, and works well for major countries. See http://maps.google.com/maps/geo?q=1%205th%20ave,new%20york,ny,us for an example. Different output formats are supported including CSV, http://maps.google.com/maps/geo?q=1%205th%20ave,new%20york,ny,us&output=csv, JSON, etc.

I'm not familiar with geocoder.us, but Google maps definitely works well for US addresses.

Edit 1: See http://code.google.com/apis/maps/faq.html#whatcountries for a list of countries supported

Edit 2: For greater relevance, here's a sample Google Maps API call for your address in question: http://maps.google.com/maps/geo?q=1125%20E.%20102nd%20Street,%20Los%20Angeles,%20CA

Skeet answered 20/1, 2012 at 15:44 Comment(2)
@AnthonyBlake Countries of a certain, arbitrary size or level of devlopment, I'm sure.Lassitude
Countries added as link in answerSkeet
I
2

Get latitude and longitude by address - Microsoft BingMapsRESTToolkit

Microsoft has an official BingMapsRESTToolkit which helps you to work with Bing Maps REST Services easily. To do so, you need to install BingMapsRESTToolkit NuGet Package.

Here, you are interested in GeocodeRequest to get location by address. You can specify the address by setting Query property to the specified address or setting Address property to an instance of Address or SimpleAddress.

Example:

var request = new GeocodeRequest();
request.BingMapsKey = "Your Map Key";

request.Query = "The Postal address";

//OR
//request.Address = new SimpleAddress()
//{
//    CountryRegion = "The Country",
//    AddressLine = "The official street line of an address relative to the area",
//    AdminDistrict = "The subdivision name in the country or region for an address",
//    Locality = "The locality, such as the city or neighborhood", 
//    PostalCode = "The postal code",
//};

var result = await request.Execute();
if (result.StatusCode == 200)
{
    var toolkitLocation = (result?.ResourceSets?.FirstOrDefault())
        ?.Resources?.FirstOrDefault() as BingMapsRESTToolkit.Location;
    var latitude = toolkitLocation.Point.Coordinates[0];
    var longitude = toolkitLocation.Point.Coordinates[1];

    // Use latitude and longitude
}

More information:

Izmir answered 16/1, 2021 at 20:53 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.