简体   繁体   中英

Get Latitude Longitude from an address c#

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.

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)

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

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:

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM