About the Single line address geocoding Sample
[C#]
SingleLineGeocodingForm.cs
using System; using System.Windows.Forms; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Location; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Geometry; namespace SingleLineGeocoding { public partial class SingleLineGeocodingForm : Form { private AoInitialize m_license = null; private ILocator m_locator = null; private String[] m_addressFields; private String m_orgAddrLabel = "Address"; public SingleLineGeocodingForm() { GetLicense(); InitializeComponent(); ReturnLicence(); } private void GeocodeAddress(IPropertySet addressProperties) { // Match the Address IAddressGeocoding addressGeocoding = m_locator as IAddressGeocoding; IPropertySet resultSet = addressGeocoding.MatchAddress(addressProperties); // Print out the results object names, values; resultSet.GetAllProperties(out names, out values); string[] namesArray = names as string[]; object[] valuesArray = values as object[]; int length = namesArray.Length; IPoint point = null; for (int i = 0; i < length; i++) { if (namesArray[i] != "Shape") this.ResultsTextBox.Text += namesArray[i] + ": " + valuesArray[i].ToString() + "\n"; else { if (point != null && !point.IsEmpty) { point = valuesArray[i] as IPoint; this.ResultsTextBox.Text += "X: " + point.X + "\n"; this.ResultsTextBox.Text += "Y: " + point.Y + "\n"; } } } this.ResultsTextBox.Text += "\n"; } private void locatorButton_Click(object sender, EventArgs e) { addressLabel.Text = m_orgAddrLabel; DialogResult result = openFileDialog.ShowDialog(); if (result == DialogResult.OK) { String locatorPath = openFileDialog.FileName; locatorPath = locatorPath.Substring(0, locatorPath.LastIndexOf('.')); if (locatorPath != null && locatorPath != "") { locatorTextBox.Text = locatorPath; addressTextBox.Enabled = true; // Open the workspace String workspaceName = locatorPath.Substring(0, locatorPath.LastIndexOf("\\")); String locatorName = locatorPath.Substring(locatorPath.LastIndexOf("\\") + 1); // Get the locator System.Object obj = Activator.CreateInstance(Type.GetTypeFromProgID("esriLocation.LocatorManager")); ILocatorManager2 locatorManager = obj as ILocatorManager2; ILocatorWorkspace locatorWorkspace = locatorManager.GetLocatorWorkspaceFromPath(workspaceName); m_locator = locatorWorkspace.GetLocator(locatorName); m_addressFields = get_AddressFields(); addressLabel.Text += " (" + String.Join(",", m_addressFields) + ")"; } } } private void findButton_Click(object sender, EventArgs e) { String[] addressValues = addressTextBox.Text.Split(','); if (addressValues.Length == m_addressFields.Length) { IPropertySet addressProperties = createAddressProperties(m_addressFields, addressValues); GeocodeAddress(addressProperties); } else if(m_addressFields.Length == 1) { IPropertySet addressProperties = createAddressProperties(m_addressFields, addressValues); GeocodeAddress(addressProperties); } else { MessageBox.Show("Your address needs a comma between each expected address field or just commas to delimit those fields ", "Address Input Error"); } } void addressTextBox_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { // pressing "enter" should do the same as clicking the button for locating if (e.KeyValue == 13) findButton_Click(this, new System.EventArgs()); } /// <summary> /// Get the address fields for the locator /// </summary> /// <param name="locator"></param> /// <returns>A String array of address fields</returns> private String[] get_AddressFields() { ISingleLineAddressInput singleLineInput = m_locator as ISingleLineAddressInput; IAddressInputs addressInputs = null; String[] fields; if (singleLineInput != null) { IField singleField = singleLineInput.SingleLineAddressField; fields = new String[] { singleField.Name }; } else { addressInputs = m_locator as IAddressInputs; IFields multiFields = addressInputs.AddressFields; int fieldCount = multiFields.FieldCount; fields = new String[fieldCount]; for (int i = 0; i < fieldCount; i++) { fields[i] = multiFields.get_Field(i).Name; } } return fields; } /// <summary> /// Create a propertySet of address fields and values /// </summary> /// <param name="addressFields"></param> /// <param name="addressValues"></param> /// <returns>A propertySet that contains address fields and address values that correspond to the fields.</returns> private IPropertySet createAddressProperties(String[] addressFields, String[] addressValues) { int fieldCount = addressFields.Length; if (fieldCount > 1 && fieldCount != addressValues.Length) throw new Exception("There must be the same amount of address fields as address values. "); IPropertySet propertySet = new PropertySetClass(); for (int i = 0; i < fieldCount; i++) { propertySet.SetProperty(addressFields[i], addressValues[i]); } return propertySet; } private void GetLicense() { if (!ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Desktop)) throw new Exception("Could not bind to license manager. "); m_license = new AoInitializeClass(); m_license.Initialize(esriLicenseProductCode.esriLicenseProductCodeArcInfo); } private void ReturnLicence() { m_license.Shutdown(); } } }
[Visual Basic .NET]
SingleLineGeocodingForm.vb
Imports Microsoft.VisualBasic Imports System Imports System.Windows.Forms Imports ESRI.ArcGIS.Geodatabase Imports ESRI.ArcGIS.Location Imports ESRI.ArcGIS.esriSystem Imports ESRI.ArcGIS.Geometry Namespace SingleLineGeocoding Public Partial Class SingleLineGeocodingForm : Inherits Form Private m_license As AoInitialize = Nothing Private m_locator As ILocator = Nothing Private m_addressFields As String() Private m_orgAddrLabel As String = "Address" Public Sub New() GetLicense() InitializeComponent() ReturnLicence() End Sub Private Sub GeocodeAddress(ByVal addressProperties As IPropertySet) ' Match the Address Dim addressGeocoding As IAddressGeocoding = TryCast(m_locator, IAddressGeocoding) Dim resultSet As IPropertySet = addressGeocoding.MatchAddress(addressProperties) ' Print out the results Dim names, values As Object resultSet.GetAllProperties(names, values) Dim namesArray As String() = TryCast(names, String()) Dim valuesArray As Object() = TryCast(values, Object()) Dim length As Integer = namesArray.Length Dim point As IPoint = Nothing Dim i As Integer = 0 Do While i < length If namesArray(i) <> "Shape" Then Me.ResultsTextBox.Text += namesArray(i) & ": " & valuesArray(i).ToString() & Constants.vbLf Else If Not point Is Nothing AndAlso (Not point.IsEmpty) Then point = TryCast(valuesArray(i), IPoint) Me.ResultsTextBox.Text &= "X: " & point.X + Constants.vbLf Me.ResultsTextBox.Text &= "Y: " & point.Y + Constants.vbLf End If End If i += 1 Loop Me.ResultsTextBox.Text += Constants.vbLf End Sub Private Sub locatorButton_Click(ByVal sender As Object, ByVal e As EventArgs) Handles locatorButton.Click addressLabel.Text = m_orgAddrLabel Dim result As DialogResult = openFileDialog.ShowDialog() If result = System.Windows.Forms.DialogResult.OK Then Dim locatorPath As String = openFileDialog.FileName locatorPath = locatorPath.Substring(0, locatorPath.LastIndexOf("."c)) If Not locatorPath Is Nothing AndAlso locatorPath <> "" Then locatorTextBox.Text = locatorPath addressTextBox.Enabled = True ' Open the workspace Dim workspaceName As String = locatorPath.Substring(0, locatorPath.LastIndexOf("\")) Dim locatorName As String = locatorPath.Substring(locatorPath.LastIndexOf("\") + 1) ' Get the locator Dim obj As System.Object = Activator.CreateInstance(Type.GetTypeFromProgID("esriLocation.LocatorManager")) Dim locatorManager As ILocatorManager2 = TryCast(obj, ILocatorManager2) Dim locatorWorkspace As ILocatorWorkspace = locatorManager.GetLocatorWorkspaceFromPath(workspaceName) m_locator = locatorWorkspace.GetLocator(locatorName) m_addressFields = get_AddressFields() addressLabel.Text &= " (" & String.Join(",", m_addressFields) & ")" End If End If End Sub Private Sub findButton_Click(ByVal sender As Object, ByVal e As EventArgs) Handles findButton.Click Dim addressValues As String() = addressTextBox.Text.Split(","c) If addressValues.Length = m_addressFields.Length Then Dim addressProperties As IPropertySet = createAddressProperties(m_addressFields, addressValues) GeocodeAddress(addressProperties) ElseIf m_addressFields.Length = 1 Then Dim addressProperties As IPropertySet = createAddressProperties(m_addressFields, addressValues) GeocodeAddress(addressProperties) Else MessageBox.Show("Your address needs a comma between each expected address field or just commas to delimit those fields ", "Address Input Error") End If End Sub Private Sub addressTextBox_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles addressTextBox.KeyDown ' pressing "enter" should do the same as clicking the button for locating If e.KeyValue = 13 Then findButton_Click(Me, New System.EventArgs()) End If End Sub ''' <summary> ''' Get the address fields for the locator ''' </summary> ''' <param name="locator"></param> ''' <returns>A String array of address fields</returns> Private Function get_AddressFields() As String() Dim singleLineInput As ISingleLineAddressInput = TryCast(m_locator, ISingleLineAddressInput) Dim addressInputs As IAddressInputs = Nothing Dim fields As String() If Not singleLineInput Is Nothing Then Dim singleField As IField = singleLineInput.SingleLineAddressField fields = New String() {singleField.Name} Else addressInputs = TryCast(m_locator, IAddressInputs) Dim multiFields As IFields = addressInputs.AddressFields Dim fieldCount As Integer = multiFields.FieldCount fields = New String(fieldCount - 1) {} Dim i As Integer = 0 Do While i < fieldCount fields(i) = multiFields.Field(i).Name() i += 1 Loop End If Return fields End Function ''' <summary> ''' Create a propertySet of address fields and values ''' </summary> ''' <param name="addressFields"></param> ''' <param name="addressValues"></param> ''' <returns>A propertySet that contains address fields and address values that correspond to the fields.</returns> Private Function createAddressProperties(ByVal addressFields As String(), ByVal addressValues As String()) As IPropertySet Dim fieldCount As Integer = addressFields.Length If fieldCount > 1 AndAlso fieldCount <> addressValues.Length Then Throw New Exception("There must be the same amount of address fields as address values. ") End If Dim propertySet As IPropertySet = New PropertySetClass() Dim i As Integer = 0 Do While i < fieldCount propertySet.SetProperty(addressFields(i), addressValues(i)) i += 1 Loop Return propertySet End Function Private Sub GetLicense() If (Not ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Desktop)) Then Throw New Exception("Could not set version. ") End If m_license = New AoInitializeClass() m_license.Initialize(esriLicenseProductCode.esriLicenseProductCodeArcEditor) End Sub Private Sub ReturnLicence() m_license.Shutdown() End Sub End Class End Namespace