Composite Address Locator

1515
8
06-11-2019 09:36 AM
RickeyFight
MVP Regular Contributor

I have created a composite address locator on arcgis pro. It consist of Addresses, Locations, Streets, and Center lines. 

I have published this as a custom geocode service.

It is working as expected except that when I type in a street name and hit enter it returns no result. 

My user wants to be able to type in a street without a type and have it locate the street.

Is this possible? 

0 Kudos
8 Replies
ShanaBritt
Esri Regular Contributor

Rickey:

It is possible to do what you want, you will likely need to create a new address locator using the Create Address Locator tool based on the US Address - StreetName locator style and add it to your composite locator. The StreetName locator style allows you to search based on street name only and it does not require a house number.

What locator styles were used to create the locators that are currently participating in the composite locator you are using as a service in ArcGIS Online?

Which tool in ArcGIS Pro did you use to create the locators that participate in the composite locator?

0 Kudos
RickeyFight
MVP Regular Contributor

Shana Britt‌ Sorry I missed your response. 

I am not sure what styles refers to. 

The four styles are: US address - Single House, US Address - Dual Ranges, US Address - Street Name, General - Gazetteer 

In Pro I used the Create Address Locator tool. I then used the Create Composite Address Locator tool.

0 Kudos
ShanaBritt
Esri Regular Contributor

Rickey:

What version of Pro are you using?

What are you searching for with the Gazetteer locator?

What is the order of the locators in the composite locator?

What version of Server was the locator published as a geocode service?

If you use the Create Locator tool in Pro 2.3+ to create a locator using the StreetAddress role, similar to Dual Ranges style, you will be able to get the result you are looking for. The StreetName role allows you to search for addresses, intersections and street names. If the street segment does not have house number values associated with it or is null a street name match will be returned versus street address match.

0 Kudos
MichaelVolz
Esteemed Contributor

Shana:

What exactly is a composite locator in Pro?  I ask because I was using the Create Locator tool to create individual address locators and then I was adding these individual address locators to the Create Composite Address Locator tool that creates a composite address locator which from the surface appears to work.

It is now my understanding that a Pro composite address locator is instead creating 1 address locator with the Create Locator tool that has at least 2 different roles associated with it.  Is this correct?

0 Kudos
ShanaBritt
Esri Regular Contributor

Michael:

The Create Locator tool allows you to create a multirole locator, where you have multiple data layers and multiple locator roles in a single locator. Creating a multirole locator with street and point address data would eliminate duplicate candidates for the same address, which is what happens with a composite. The composite will return both the point address and street address candidate, when the point address one has the highest score. If the reference data used are in different coordinate systems, then the coordinate system of the first dataset is used.

Below are the Create Locator tool with multiple roles and data used as well as the properties dialog. If you create the multirole locator you can use the category settings to specify matches to specific types of categories like only Street Address and Street Intersection, but not Street Name if you have built a locator based on the Street Address role.

 

0 Kudos
MichaelVolz
Esteemed Contributor

So are you saying that if I have a POI role or Point address role first (depends if the values are concatenated into 1 field or parsed out in the data source) and then the street address role, the multirole address locator will just return the POI or street address if there is a match, otherwise just a street address match?

0 Kudos
JoeBorgione
MVP Emeritus

Not to steal Shana's thunder, but I'll toss my hat into the ring:  I have a multirole locator created with arcpy.  Below is the def() that creates it.  My three roles are point address, street address and poi. The order in which the primaryData appears as well as all the fieldMapping and altFieldMapping came right from the history of an instance of the create locator tool.  

When I use this multirole locator in pro and type in my address  I get one return based on the point address role:

Out of habit, I always order my roles or in the case of old style composites in order of my preference: most precise to least precise. I can search for 4105 S 3305 E which is not valid point address type, but it does resolve against the street role with 100%

Hope this helps...

def createMultiRoleLocator(scratchGDB,locatorsDir):
    countryCode = 'USA'
    primaryData = '{}\\AddressPoints PointAddress;{}\\Centerlines StreetAddress;{}\\Parcels POI;'.format(scratchGDB,scratchGDB,scratchGDB)
    fieldMapping = "'PointAddress.HOUSE_NUMBER AddressPoints.ADDR_HN';\
                    'PointAddress.STREET_PREFIX_DIR AddressPoints.ADDR_PD';\
                    'PointAddress.STREET_NAME AddressPoints.ADDR_SN';\
                    'PointAddress.STREET_SUFFIX_TYPE AddressPoints.ADDR_ST';\
                    'PointAddress.STREET_SUFFIX_DIR AddressPoints.ADDR_SD';\
                    'PointAddress.SUB_ADDRESS_UNIT AddressPoints.UNIT_DESIG';\
                    'StreetAddress.STREET_NAME_JOIN_ID Centerlines.JOINID';\
                    'StreetAddress.HOUSE_NUMBER_FROM_LEFT Centerlines.FROMADDR_L';\
                    'StreetAddress.HOUSE_NUMBER_TO_LEFT Centerlines.TOADDR_L';\
                    'StreetAddress.HOUSE_NUMBER_FROM_RIGHT Centerlines.FROMADDR_R';\
                    'StreetAddress.HOUSE_NUMBER_TO_RIGHT Centerlines.TOADDR_R';\
                    'StreetAddress.STREET_PREFIX_DIR Centerlines.PREDIR';\
                    'StreetAddress.STREET_NAME Centerlines.NAME';\
                    'StreetAddress.STREET_SUFFIX_TYPE Centerlines.POSTTYPE';\
                    'StreetAddress.STREET_SUFFIX_DIR Centerlines.POSTDIR';\
                    'POI.PLACE_JOIN_ID Parcels.PIN';'POI.PLACE_NAME Parcels.PIN';"

    outLocator = '{}\\MultiRole'.format(locatorsDir)
    languageCode = 'ENG'
    altNames = '{}\\CenterlinesAltNames AlternateStreetName;{}\\ParcelsAltNames AlternatePOIName'.format(scratchGDB,scratchGDB)
    altFieldMapping ="'AlternateStreetName.STREET_NAME_JOIN_ID CenterlinesAltNames.JOINID';\
                    'AlternateStreetName.STREET_PREFIX_DIR CenterlinesAltNames.PREDIR';\
                    'AlternateStreetName.STREET_NAME CenterlinesAltNames.AN_NAME';\
                    'AlternateStreetName.STREET_SUFFIX_TYPE CenterlinesAltNames.POSTTYPE';\
                    'AlternateStreetName.STREET_SUFFIX_DIR CenterlinesAltNames.AN_POSTDIR';\
                    'AlternatePOIName.PLACE_JOIN_ID ParcelsAltNames.PIN';\
                    'AlternatePOIName.PLACE_NAME ParcelsAltNames.PIN10'"
                       
    try:
        arcpy.geocoding.CreateLocator(countryCode,primaryData,fieldMapping,outLocator,languageCode,
                                      altNames,altFieldMapping)
        print('Success: created multi-role locator')
    except Exception as err:
        print (err)
        print('Error: unable to create multi-role locator. Exiting' )
        #time.sleep(5)
        #exit
        #sendEmail(err)         
        exit()     
That should just about do it....
0 Kudos
ShanaBritt
Esri Regular Contributor

I'm saying that if you build a locator with the POI, PointAddress, and StreetAddress role in the same locator that you can search for places and addresses and get candidates from each of the roles. If the data used for the POI role includes the place name and has an address associated with it  as well as a category, you can search for places by name, category, address, or a combination of name or category and parts of the address. For example, Starbucks, Orange St, Redlands or gas station, Boulder, CO.

If you searched for a POI name the match result would be from the POI role. If you searched for an address that matches against both PointAddress and StreetAddress roles, the match will be to the PointAddress candidate as it's the most accurate. The composite that contains a PointAddress and StreetAddress role will return two candidates from each role. If you adjusted the supported categories for the multirole locator where only PointAddress and POI categories were supported, if you searched for an address that could only be matched to the StreetAddress role it would be unmatched or if you searched for an intersection. If you wanted to exclude addresses from matching to the Street Name when there was no StreetAddress match you would uncheck Street Name under the Address category.

0 Kudos