Viac

Konvertujete vysoko presnú množinu údajov v súborovej geodatabázi na nízku presnosť pomocou ArcObjects?


Veľmi presná množina údajov bola načítaná zo súborovej geodatabázy do arcsde 9.3.1. Načítanie dát bolo dosiahnuté kopírovaním / vkladaním do ArcCatalogu.

Vlastný nástroj (arcobjects), ktorý extrahuje z množiny údajov do osobnej geodatabázy s nízkou presnosťou, teraz zlyháva pri pokuse o vytvorenie triedy výstupných prvkov.

Nie je možné upgradovať osobnú geodatabázu na vysokú presnosť, pretože všetky ostatné súbory údajov, ktoré extrahuje zo súboru sde, majú nízku presnosť.

Je možné vysoko presný súbor údajov znížiť?


Nakoniec som to vyriešil úpravou vlastného extrakčného kódu, aby som zohľadnil presnosť zdrojových a cieľových priestorových odkazov.

Kód:

public ISpatialReference createDestinationSpatialRef (IGeoDataset srcDataset, IFeatureWorkspace destinationWorkspace) {ISpatialReference result = srcDataset.SpatialReference; IControlPrecision2 sourceDatasetPrecision = výsledok ako IControlPrecision2; if (sourceDatasetPrecision.IsHighPrecision) {if (geodatabaseSupportsHighPrecision (destinationWorkspace)) {// HP na HP, žiadna konverzia} else {IEnvelope rozsah = srcDataset.Extent; result = ConvertSpatialReferenceFromHighToLowPrecision (výsledok, rozsah); }} else {if (geodatabaseSupportsHighPrecision (destinationWorkspace)) {result = ConvertSpatialReferenceFromLowToHighPrecision (result, -1, 0, 0); } else {// LP na LP, bez konverzie}} návratový výsledok; } public bool geodatabaseSupportsHighPrecision (IFeatureWorkspace fws) {IGeodatabaseRelease2 release = fws ako IGeodatabaseRelease2; // vydanie geodatabázy je očíslované 2,2 pri 9,2 return ((release! = null) && ((release.MajorVersion + 7)> = 9) && (release.MinorVersion> = 2)); } ///  / / / Konvertuje existujúci priestorový odkaz s nízkou presnosťou a vráti nový priestorový odkaz s vysokou presnosťou. ///  /// Rozhranie ISpatialReference, ktoré predstavuje nízky priestorový odkaz, ktorý sa má previesť. /// System.Int32, čo je množstvo zdvojnásobenia (2 ^ x) na základe vstupného rozlíšenia; -1 vytvorí hodnotu blízku predvolenému rozlíšeniu. Príklad: -1 /// System.Int32, ktorý určuje zdvojnásobenie m-rozlíšenia na základe vstupného m-rozlíšenia; predvolená hodnota je 0. Príklad: 0 /// System.Int32, ktorý určuje zdvojnásobenie rozlíšenia z na základe vstupného rozlíšenia z; predvolená hodnota je 0. Príklad: 0 /// Rozhranie ISpatialReference, ktoré je novým priestorovým odkazom s vysokou presnosťou. public ISpatialReference ConvertSpatialReferenceFromLowToHighPrecision (ISpatialReference lowSpatialReference, int xyDoubler, int mDoubler, int zDoubler) {IControlPrecision2 controlPrecision2 = lowSpatialReference ako IControlPrecision2; if (controlPrecision2.IsHighPrecision) throw new ArgumentException ("Expected a low precision spatial reference.", "lowSpatialReference"); ISpatialReferenceFactory3 spatialReferenceFactory3 = nový SpatialReferenceEnvironmentClass (); ISpatialReference highSpatialReference = spatialReferenceFactory3.ConstructHighPrecisionSpatialReference (lowSpatialReference, xyDoubler, zDoubler, mDoubler); návrat highSpatialReference; } ///  / / / Konvertuje existujúci priestorový odkaz s vysokou presnosťou a vráti nový priestorový odkaz s nízkou presnosťou. ///  /// Rozhranie ISpatialReference, ktoré je veľmi presným priestorovým odkazom. /// Obálka IEnvelope, čo je oblasť pokrývajúca rozsah nového nízkopresného priestorového odkazu. /// Rozhranie ISpatialReference, ktoré je novým priestorovým odkazom s nízkou presnosťou. public ISpatialReference ConvertSpatialReferenceFromHighToLowPrecision (ISpatialReference highSpatialReference, obálka IEnvelope) {IControlPrecision2 controlPrecision2 = highSpatialReference ako IControlPrecision2; if (! controlPrecision2.IsHighPrecision) throw new ArgumentException ("Expected a high precision spatial reference.", "highSpatialReference"); ISpatialReference lowSpatialReference = null; ISpatialReferenceFactory3 spatialReferenceFactory3 = nový SpatialReferenceEnvironmentClass (); try {lowSpatialReference = spatialReferenceFactory3.ConstructLowPrecisionSpatialReference (true, highSpatialReference, obálka); } catch (System.Runtime.InteropServices.COMException ex) {if (ex.ErrorCode == -2147220986) {lowSpatialReference = spatialReferenceFactory3.ConstructLowPrecisionSpatialReference (false, highSpatialReference, obálka); }} návrat lowSpatialReference; }

Pre verzie ArcGIS 9.0 / 9.1 / 9.2 vždy uchovávam staré údaje Esri ArcTutor. Použité geodatabázy majú nízku presnosť a vždy ich môžem použiť ako šablónu na import / export údajov, keď potrebujem zmeniť presnosť. Porozprávajte sa so svojimi zástupcami Esri alebo sa pozrite na svoje softvérové ​​zdieľané disky. Možno nájdete nejaké staré údaje ArcTutor alebo možno staré geodatabázy ArcGIS, ktoré by na tento účel mohli slúžiť.


Ak je v čísle desatinné miesto, povedzme 10.343243, môžete jednoducho použiť funkciu left ({názov stĺpca}, #preserved) v databáze atribútov arcmap. Dáme vám 10,343, čo by bolo menej presné.

Ak je číslo 10343243, môžete znova použiť tú istú funkciu, iba pridáte nuly späť do čísla po počiatočnej funkcii. Niečo ako základné zaoblenie.

Dáva zmysel?