Пример #1
0
        /// <summary>
        /// Geocode order, using local geocoder.
        /// </summary>
        /// <param name="order">Order to geocode.</param>
        /// <param name="useLocalAsPrimary">If true and record exists in storage, than dont use server geocoder.</param>
        /// <param name="includeDisabledLocators">Is need to add candidates from disabled locators.</param>
        /// <returns>Candidates list.</returns>
        private static List <AddressCandidate> _DoLocalOrderGeocode(Order order, bool useLocalAsPrimary, bool includeDisabledLocators)
        {
            LocalGeocoder localGeocoder = new LocalGeocoder(App.Current.Geocoder, App.Current.NameAddressStorage);

            NameAddress nameAddress = new NameAddress();

            nameAddress.Name    = order.Name;
            nameAddress.Address = (Address)order.Address.Clone();

            List <AddressCandidate> candidates = new List <AddressCandidate>();

            AddressCandidate candidateFromLocalGeocoder = localGeocoder.Geocode(nameAddress);

            if (useLocalAsPrimary && candidateFromLocalGeocoder != null)
            {
                candidates.Add(candidateFromLocalGeocoder);
            }
            else
            {
                AddressCandidate[] candidatesArray = localGeocoder.GeocodeCandidates(nameAddress, includeDisabledLocators);
                candidates.AddRange(candidatesArray);
            }

            return(candidates);
        }
Пример #2
0
        /// <summary>
        /// Check is location of geocodable object valid and replace it by candidate from local
        /// geocoder if exists.
        /// </summary>
        /// <param name="geocodable">Geocodable object to check.</param>
        /// <returns>Is geocodable object valid.</returns>
        private bool _SourceGeocodedObject(IGeocodable geocodable)
        {
            Debug.Assert(null != geocodable); // created

            bool isObjectGeocoded = false;

            // First check if name address pair exists in local geocoder database.
            // If exists - overwrite geolocation and address from it.
            App currentApp = App.Current;
            var localGeocoder =
                new LocalGeocoder(currentApp.Geocoder, currentApp.NameAddressStorage);

            var nameAddress = new NameAddress();
            nameAddress.Name = geocodable.ToString();
            nameAddress.Address = geocodable.Address.Clone() as Address;

            AddressCandidate localCandidate = localGeocoder.Geocode(nameAddress);
            if (localCandidate == null)
            {   // Update from internal object information.
                AppGeometry.Envelope extent = currentApp.Map.ImportCheckExtent;
                if (extent.IsPointIn(geocodable.GeoLocation.Value))
                {
                    geocodable.Address.MatchMethod =
                        currentApp.FindString("ImportSourceMatchMethod");
                    isObjectGeocoded = true;

                    // Full address property must be combined from other fields, because
                    // it is not importing field.
                    if (App.Current.Geocoder.AddressFormat == AddressFormat.MultipleFields)
                        GeocodeHelpers.SetFullAddress(geocodable.Address);
                    else
                    {
                        // Do nothing: do not update full address since
                        // it is used for geocoding in Single Address Field Format.
                    }
                }
                // Else could not locate object using X/Y attributes - need geocode.
            }
            else
            {   // Init from local candidate.
                // Set location.
                geocodable.GeoLocation = new AppGeometry.Point(localCandidate.GeoLocation.X,
                                                               localCandidate.GeoLocation.Y);
                // Set address.
                localCandidate.Address.CopyTo(geocodable.Address);

                isObjectGeocoded = true;
            }

            return isObjectGeocoded;
        }
Пример #3
0
        /// <summary>
        /// Geocode order, using local geocoder.
        /// </summary>
        /// <param name="order">Order to geocode.</param>
        /// <param name="useLocalAsPrimary">If true and record exists in storage, than dont use server geocoder.</param>
        /// <param name="includeDisabledLocators">Is need to add candidates from disabled locators.</param>
        /// <returns>Candidates list.</returns>
        private static List<AddressCandidate> _DoLocalOrderGeocode(Order order, bool useLocalAsPrimary, bool includeDisabledLocators)
        {
            LocalGeocoder localGeocoder = new LocalGeocoder(App.Current.Geocoder, App.Current.NameAddressStorage);

            NameAddress nameAddress = new NameAddress();
            nameAddress.Name = order.Name;
            nameAddress.Address = (Address)order.Address.Clone();

            List<AddressCandidate> candidates = new List<AddressCandidate>();

            AddressCandidate candidateFromLocalGeocoder = localGeocoder.Geocode(nameAddress);

            if (useLocalAsPrimary && candidateFromLocalGeocoder != null)
            {
                candidates.Add(candidateFromLocalGeocoder);
            }
            else
            {
                AddressCandidate[] candidatesArray = localGeocoder.GeocodeCandidates(nameAddress, includeDisabledLocators);
                candidates.AddRange(candidatesArray);
            }

            return candidates;
        }
Пример #4
0
        /// <summary>
        /// Does batch geocoding.
        /// </summary>
        /// <param name="objects">Objects to geocoding.</param>
        private void _BatchGeocode(IList<AppData.DataObject> objects)
        {
            Debug.Assert(null != objects); // created
            Debug.Assert(0 < objects.Count); // not empty
            Debug.Assert(null != _checker); // inited

            try
            {
                // create list of addresses
                Address[] addresses = _CreateAddressList(objects);

                // start geocode
                App currentApp = App.Current;
                AddressCandidate[] candidates = null;
                if (objects[0] is Order)
                {   // for orders - use local geocoding
                    NameAddress[] namedAddress = _CreateNamedAddressList(objects);

                    var localGeocoder = new LocalGeocoder(currentApp.Geocoder,
                                                          currentApp.NameAddressStorage);
                    candidates = localGeocoder.BatchGeocode(namedAddress);
                }
                else
                {   // for other object - use server geocoder
                    candidates = currentApp.Geocoder.BatchGeocode(addresses);
                }

                _checker.ThrowIfCancellationRequested();

                // validate geocode
                _ValidateLocation(addresses, candidates);

                // If current geocoder is arcgiscomgeocoder - check that we got
                // candidates from "good" locators.
                var arcgisgeocoder = App.Current.Geocoder as ArcGiscomGeocoder;
                if (arcgisgeocoder != null)
                {
                    for (int i = 0; i < candidates.Count(); i++)
                    {
                        var goodAddressType =
                            arcgisgeocoder.ExactLocatorsTypesNames.Contains(candidates[i].AddressType);
                        if (!goodAddressType)
                            candidates[i] = new AddressCandidate();
                    }
                }

                // parse result
                _ParseBatchGeocodeResult(candidates, objects);
            }
            catch (Exception ex)
            {
                Logger.Error(ex);

                // store exception
                _detectedException = ex;
            }
        }