Více

Pořadí os v uživatelském Shapefile

Pořadí os v uživatelském Shapefile


Mám tvarový soubor, který má následující PRJ

GEOGCS ["WGS 84", DATUM ["World Geodetic System 1984", SPHEROID ["WGS 84", 6378137.0, 298.257223563, AUTHORITY ["EPSG", "7030"]], AUTHORITY ["EPSG", "6326"]] , PRIMEM ["Greenwich", 0,0, AUTHORITY ["EPSG", "8901"]], UNIT ["stupeň", 0,017453292519943295], AXIS ["Geodetická šířka", SEVER], OSA ["Geodetická délka", VÝCHOD], ORGÁN ["EPSG", "4326"]]

Pokud chápu, znamená to lat, dlouhé objednávání. Když však čtu funkce pomocí geotoolů, získávám souřadnice v dlouhém, lat pořadí, alespoň to vidím v mém debuggeru po analýze funkcí. Problém je v tom, že dělám reprojekci na 4326 pomocí následujícího kódu (dělám obecnou službu importu shapefile):

CoordinateReferenceSystem geo = CRS.decode ("EPSG: 4326", true); CoordinateReferenceSystem crs = feature.getFeatureType (). GetCoordinateReferenceSystem (); MathTransform transformace = null; if (! crs.equals (geo)) {try {transform = CRS.findMathTransform (crs, geo, true); } catch (FactoryException e) {hodit novou výjimku ("Nepodporovaný typ projekce"); }}

A to vrátí všechny lat dlouhé souřadnice!

Pokud je správné říci, že pořadí os je důležité v souboru PRJ, a za předpokladu, že skutečně existuje nesoulad objednávek mezi PRJ a SHP, jak to mohu vyřešit?


Co bych udělal, je nejprve zkontrolovat, zda je můj předpoklad uspořádání zdrojové osy (lat, lon) správný. Jednoduše si vizualizujte, řekněme, google mapy vašich souřadnic a podívejte se, zda tam vaše studijní oblast skutečně je.

Další věc, kterou je třeba mít na paměti, je, že různé softwarové produkty mají odlišné back-endové kódování toho, jak zacházejí s CRS. Může to být velmi dobrý případ, že geotools nebo váš kód je napsán způsobem, který přijímá data na základě předdefinované definice pořadí os.

V každém případě, jakmile je vaše reprojekce hotová a pokud se soubor shapefile nezobrazí tam, kde má, můžete ručně změnit pořadí os v souboru .prj. To pro mě určitě fungovalo v případech transformací schémat s HALE, kde software nezpracovával moje projekce přesně. Ruční vměšování do souboru .prj bylo řešením, ale pokud máte velkou sadu dat, mohlo by to být nepraktické.


Obecně platí, že v případech, jako jsou tyto, se podívejte na Časté dotazy k objednávce os GeoTools - takže máte pravdu, že vaše osová objednávka v shapefile je lat / lon.

Dále existují problémy s vaším kódem:

CoordinateReferenceSystem geo = CRS.decode ("EPSG: 4326", true);

vytvoří CRS s lon / lat, pokud (a pouze pokud) je systémová nápověda FORCE_LONGITUDE_FIRST_AXIS_ORDER nastavena na true, což může nebo nemusí být tento případ.

Je lepší mít jistotu a použít něco jako:

// vynutit, aby byl výstupní CRS dlouhý, lat podle požadavků spec CRSAuthorityFactory cFactory = CRS.getAuthorityFactory (true); try {outCRS = cFactory.createCoordinateReferenceSystem ("EPSG: 4326"); } catch (FactoryException e) {throw new RuntimeException ("CRS factory not found", e); }

Taky

if (! crs.equals (geo)) {

Bude téměř vždy nepravdivé, protože šance, že 2 objekty CRS budou stejným objektem, jsou malé, je mnohem lepší použít:

if (! CRS.equalsIgnoreMetadata (crs, geo)) {

protože to zkontroluje, zda se skutečné parametry shodují.

Můžete také použítCRS.getAxisOrder (crs)získat pořadí os jako snadno srovnatelný výčet.