@@ -39,6 +39,7 @@ public class AzureMapsGeocoder : IGeocoder
3939
4040 /// <summary>
4141 /// Gets or sets the user IP address associated with the request.
42+ /// Retained for API compatibility only. Azure Maps Search does not accept an explicit user-IP hint when using subscription-key authentication, so the value is ignored.
4243 /// </summary>
4344 public IPAddress ? UserIP { get ; set ; }
4445
@@ -228,13 +229,17 @@ private IEnumerable<AzureMapsAddress> ParseResponse(AzureSearchResponse response
228229 continue ;
229230
230231 var address = result . Address ?? new AzureAddressPayload ( ) ;
232+ var formattedAddress = FirstNonEmpty ( address . FreeformAddress , address . StreetNameAndNumber , BuildStreetLine ( address . StreetNumber , address . StreetName ) , result . Poi ? . Name , result . Type , FirstNonEmpty ( address . LocalName , address . Municipality , address . CountryTertiarySubdivision ) , address . Country ) ;
233+ if ( String . IsNullOrWhiteSpace ( formattedAddress ) )
234+ continue ;
235+
231236 var locality = FirstNonEmpty ( address . LocalName , address . Municipality , address . CountryTertiarySubdivision ) ;
232237 var neighborhood = IncludeNeighborhood
233238 ? FirstNonEmpty ( address . Neighbourhood , address . MunicipalitySubdivision )
234239 : String . Empty ;
235240
236241 yield return new AzureMapsAddress (
237- FirstNonEmpty ( address . FreeformAddress , address . StreetNameAndNumber , BuildStreetLine ( address . StreetNumber , address . StreetName ) , result . Poi ? . Name , result . Type , locality , address . Country ) ,
242+ formattedAddress ,
238243 new Location ( result . Position . Lat , result . Position . Lon ) ,
239244 BuildStreetLine ( address . StreetNumber , address . StreetName ) ,
240245 FirstNonEmpty ( address . CountrySubdivisionName , address . CountrySubdivision ) ,
@@ -249,38 +254,46 @@ private IEnumerable<AzureMapsAddress> ParseResponse(AzureSearchResponse response
249254 yield break ;
250255 }
251256
252- if ( response . Addresses is not null )
253- {
254- foreach ( var reverseResult in response . Addresses )
255- {
256- if ( reverseResult ? . Address is null || reverseResult . Position is null || String . IsNullOrWhiteSpace ( reverseResult . Position ) )
257- continue ;
258-
259- var address = reverseResult . Address ;
260- if ( ! TryParsePosition ( reverseResult . Position ! , out var lat , out var lon ) )
261- continue ;
262-
263- var locality = FirstNonEmpty ( address . LocalName , address . Municipality , address . CountryTertiarySubdivision ) ;
264- var neighborhood = IncludeNeighborhood
265- ? FirstNonEmpty ( address . Neighbourhood , address . MunicipalitySubdivision )
266- : String . Empty ;
257+ if ( response . Addresses is null )
258+ yield break ;
267259
268- yield return new AzureMapsAddress (
269- FirstNonEmpty ( address . FreeformAddress , address . StreetNameAndNumber , BuildStreetLine ( address . StreetNumber , address . StreetName ) , locality , address . Country ) ,
270- new Location ( lat , lon ) ,
271- BuildStreetLine ( address . StreetNumber , address . StreetName ) ,
272- FirstNonEmpty ( address . CountrySubdivisionName , address . CountrySubdivision ) ,
273- address . CountrySecondarySubdivision ,
274- address . Country ,
275- locality ,
276- neighborhood ,
277- address . PostalCode ,
278- EntityType . Address ,
279- ConfidenceLevel . High ) ;
280- }
260+ foreach ( var reverseResult in response . Addresses . Where ( result => result ? . Address is not null && ! String . IsNullOrWhiteSpace ( result . Position ) ) )
261+ {
262+ var reverseAddress = CreateReverseAddress ( reverseResult ) ;
263+ if ( reverseAddress is not null )
264+ yield return reverseAddress ;
281265 }
282266 }
283267
268+ private AzureMapsAddress ? CreateReverseAddress ( AzureReverseResult ? reverseResult )
269+ {
270+ if ( reverseResult ? . Address is null || ! TryParsePosition ( reverseResult . Position ! , out var lat , out var lon ) )
271+ return null ;
272+
273+ var address = reverseResult . Address ;
274+ var formattedAddress = FirstNonEmpty ( address . FreeformAddress , address . StreetNameAndNumber , BuildStreetLine ( address . StreetNumber , address . StreetName ) , FirstNonEmpty ( address . LocalName , address . Municipality , address . CountryTertiarySubdivision ) , address . Country ) ;
275+ if ( String . IsNullOrWhiteSpace ( formattedAddress ) )
276+ return null ;
277+
278+ var locality = FirstNonEmpty ( address . LocalName , address . Municipality , address . CountryTertiarySubdivision ) ;
279+ var neighborhood = IncludeNeighborhood
280+ ? FirstNonEmpty ( address . Neighbourhood , address . MunicipalitySubdivision )
281+ : String . Empty ;
282+
283+ return new AzureMapsAddress (
284+ formattedAddress ,
285+ new Location ( lat , lon ) ,
286+ BuildStreetLine ( address . StreetNumber , address . StreetName ) ,
287+ FirstNonEmpty ( address . CountrySubdivisionName , address . CountrySubdivision ) ,
288+ address . CountrySecondarySubdivision ,
289+ address . Country ,
290+ locality ,
291+ neighborhood ,
292+ address . PostalCode ,
293+ EntityType . Address ,
294+ ConfidenceLevel . High ) ;
295+ }
296+
284297 private static bool TryParsePosition ( string position , out double latitude , out double longitude )
285298 {
286299 latitude = 0 ;
0 commit comments