Jarosław S.

Jarosław S. mgr inż. ochrony
środowiska,
specjalista GIS

Temat: Odwrócenie współrzędnych X, Y

Szanowna grupo,

przeszukałem zgrubnie fora gl, trochę internetu i niezbyt znalazłem rozwiązanie mojego problemu, a jest on następujący:

Mam dość grubaśnego (ponad 2GB) shape'a poligonowego z obszaru PL - obiektów jest tam bardzo dużo. Niestety współrzędne X,Y są tam odwrócone i trzeba to jakoś ugryźć. Z komercyjnego oprogramowania do dyspozycji mam ArcGIS 9.3
Do tej pory próbowałem:

- znaleźć wtyczkę/skrypt do produktów ESRI *bezskutecznie*;
- przekonwertować wtyczką do QGIS SWAP X,Y autorstwa Borysa Jurgiela, jednak soft zalicza zwiechę;
- wpadłem na pomysł by podzielić shp na mniejsze kawałki, jednak przy podziale na 16 (woj.) nadal są problemy ze stabilnością i potwornie jest to upierdliwe;
- wyczytałem, że program Geox konwertuje dane w pożądany sposób, ale boję się kupować soft wiedząc co się stało w przypadku, stabilnego przecież w miarę, QGISa.

Czy szacowne grono ma jakieś pomysły, proszę?

EDIT: Przed chwilą wpadłem na jeszcze jeden pomysł - może Wy coś lepszego do tego dorobicie... Otóż może zaimportować te dane w geobazę osobistą ESRI (mdb) i tam pokombinować kwerendami... No tak, tyle że dane geometrii są trzymane w jednej kolumnie i nijak się z tego X od Y oddzielić nie da (typ binary). A jeśli zapisać przestrzeń z atrybutami jako jakiś csv/dbf i wtedy w Accessie zamienić XY? To by zadziałało, tylko problem z ponownym stworzeniem poligonów z punktów pewnie by był. Sprawdzę to jutro i dam znać...Jarosław Sadowski edytował(a) ten post dnia 09.08.11 o godzinie 22:27
Piotr T.

Piotr T. programista GIS,
analityk GIS,
(www.cgis.pl)

Temat: Odwrócenie współrzędnych X, Y

Jarosław Sadowski:
- wyczytałem, że program Geox konwertuje dane w pożądany sposób, ale boję się kupować soft wiedząc co się stało w przypadku, stabilnego przecież w miarę, QGISa.

Śmiem wątpić aby 64bitowa Geoxa wywróciła się na 2GB danych (aczkolwiek limit formatu shp to nieco ponad 2gb danych bo tak ten format jest skonstruowany) - jest demo to sobie możesz sprawdzić sam... Spakuj 7zip i udostępnij gdzieś to Ci przekręce te dane bez problemu...Piotr Tracz edytował(a) ten post dnia 09.08.11 o godzinie 22:44

konto usunięte

Temat: Odwrócenie współrzędnych X, Y

Zacząłbym od przekonwertowania tego shape do geobazy plikowej, a potem potraktował go Pythonem
Jeśli Twój pomysł się nie sprawdzi, a nie możesz udostępnić danych Piotrowi, to mogę ów skrypt skrobnąć.
Michał K.

Michał K. WebGIS Magician

Temat: Odwrócenie współrzędnych X, Y

Możesz spróbować przy pomocy transformacji afinicznej o ile masz funkcję, która pozwala wpisywać współczynniki macierzy.
Tak to wygląda w PostGISie - ST_Affine(geom, a, b, d, e, xoff, yoff) - w przypadku zamiany XY b i d są jedynkami, reszta to zera.
Dominik Mikiewicz

Dominik Mikiewicz maps made easy,
www.cartomatic.pl ||
cartoninjas.net

Temat: Odwrócenie współrzędnych X, Y

maniek również nie powinien marudzić. Jak wystawisz paczkę online też mogę Ci to zmielić ;-)

konto usunięte

Temat: Odwrócenie współrzędnych X, Y

Witam,
mam plik xml (z dopiskiem .gml), otwierając go w qgisie i próbując zapisać jako .shp zawartość znika. O co kaman?
Działam zgodnie z tym:
http://geoinformacja.wordpress.com/2010/10/04/wfs-pobi...

konto usunięte

Temat: Odwrócenie współrzędnych X, Y

na forum qgis jest link do wtyczki swap xy do qgisa, która zamienia współrzędne.
http://forum.quantum-gis.pl/attachment.php?aid=20
Jarosław S.

Jarosław S. mgr inż. ochrony
środowiska,
specjalista GIS

Temat: Odwrócenie współrzędnych X, Y

Szkoda, że nie przeczyałeś mojego postu chociaż do połowy. Warstwa jest duża i

"- przekonwertować wtyczką do QGIS SWAP X,Y autorstwa Borysa Jurgiela, jednak soft zalicza zwiechę;"

Do tematu kiedyś powrócę i go zamknę, bo nadal tak się nie stało. Niestety teraz mam inne priorytety.
Dominik Mikiewicz

Dominik Mikiewicz maps made easy,
www.cartomatic.pl ||
cartoninjas.net

Temat: Odwrócenie współrzędnych X, Y

jak Twoje dane nie są ściśle tajne / poufne, etc, to daj znać. Chętnie dam im kopa ;-)
Jarosław S.

Jarosław S. mgr inż. ochrony
środowiska,
specjalista GIS

Temat: Odwrócenie współrzędnych X, Y

Dominiku i inni, którzy wcześniej zadeklarowali pomoc w ich przekształceniu:

dane tajne nie są, ale nie jestem ich właścicielem, więc niestety nijak udostępnić ich nie mogę (pochodzą z innej instytucji niż ta, w której aktualnie pracuję). Tym niemniej szczerze dziękuję za chęć pomocy - pozytywnie zaskakuje mnie fakt, że są jeszcze takie miejsca w internecie :) Jak obiecałem do tematu powrócę i spróbuję wypracować i podzielić się jakimś rozwiązaniem - może niekoniecznie eleganckim, ale skutecznym i darmowym (dlatego jeszcze nie wziąłem się za GEOX). Zapewne jeszcze o niejedno w tym temacie Was podpytam. Póki co problem nieco pokurzy się na mojej półce... ;)

Temat: Odwrócenie współrzędnych X, Y

Witajcie.
W środowisku ESRI można wykorzystać skrypt w Pythonie zaproponowany na forum ESRI.
Skrypt ma jednak pewne ograniczenie - nie obsługuje poligonów zawierających 'wyspy' (interior ring). Oskryptowanie tego nie jest tak proste jak w przypadku wtyczki do QGISa, ale udało mi się dojść jak to zrobić:

import arcgisscripting, os
gp = arcgisscripting.create(9.3)

inFC = r"Z:\SwapXY.gdb\Polygon" #sciezka warstwy wejsciowej
outFC = r"Z:\SwapXY.gdb\SwapXY_Polygon" #sciezka warstwy wyjsciowej

#tworzenie nowej warstwy wynikowej (jesli nie istnieje)
if not gp.Exists(outFC):
gp.CreateFeatureClass_management(os.path.dirname(outFC),os.path.basename(outFC),"POLYGON",inFC,"","",inFC)

try:
inRows = gp.SearchCursor(inFC) #kursor do odczytu danych
row = inRows.next()
outRows = gp.InsertCursor(outFC) #kursor do zapisu danych

#macierze do przechowania wierzcholki ze zmienionymi wspolrzednymi
featureVertexArray = gp.CreateObject("Array")
partVertexArray = gp.CreateObject("Array")

while row:
feature = row.getValue("SHAPE") #odczyt geometrii
vertex = gp.CreateObject("Point") #pusty obiekt punktowy do przechowania geometrii

#poligon moze miec wiele czesci - najpierw iteracja przez czesci
partNum = 0
partCount = feature.PartCount
while partNum < partCount:
part = feature.GetPart(partNum) #macierz punktow z czesci poligonu

#iteracja przez wszystkie punkty macierzy
pnt = part.next()
while pnt:
vertex.X, vertex.Y = pnt.Y, pnt.X #przypisanie zamienionych wspolrzednych
partVertexArray.add(vertex)
pnt = part.next()

#Obsluga 'wysp' - jesli pnt jest pusty, to albo czesc sie zakonczyla, albo jest 'wyspa'
if not pnt:
pnt = part.next()
featureVertexArray.add(partVertexArray)
partVertexArray.removeAll()
#if pnt:
# print "Interior"

featureVertexArray.add(partVertexArray)
partNum += 1

#tworzenie nowego wiersza w warstwie wyjsciowej
newFeature = outRows.newRow()
newFeature.SHAPE = featureVertexArray #wpisanie geometrii na podstawie macierzy punktow
for field in gp.ListFields(inFC): #dolaczenie atrybutow z warstwy wejsciowej
if field.Name.upper() not in ("OBJECTID", "SHAPE", "SHAPE_LENGTH", "SHAPE_AREA"):
newFeature.setValue(field.Name, row.getValue(field.Name))
outRows.insertRow(newFeature)

featureVertexArray.removeAll()
partVertexArray.removeAll()
row = inRows.next()

except:
print gp.GetMessages()


W geobazie plikowej z przetworzeniem danych nie powinno być problemu - to raczej kwestia czasu. Przetestowałem shp o wielkości ~430Mb/170tys. obiektów (w geobazie ~100Mb) i zajęło to ok. 18 min.

ps. Dominik, pochwal się jak prosty skrypt wystarczy w MF aby osiągnąć to samo;)

EDIT
Linki do gotowych narzędzi skryptowych do użycia prosto z toolboxa:
Dla wersji 9.3:
http://www.arcgis.com/home/item.html?id=a26bccd5c77241...
Dla wersji 10:
http://www.arcgis.com/home/item.html?id=30d646e0ac6046...Marcin Gąsior edytował(a) ten post dnia 29.10.12 o godzinie 12:25
Dominik Mikiewicz

Dominik Mikiewicz maps made easy,
www.cartomatic.pl ||
cartoninjas.net

Temat: Odwrócenie współrzędnych X, Y

Tak na szybko, żeby było w miarę podobnie:


static void Main() {
M.Application mApp = Context.Application;
M.Document mDoc = (M.Document)mApp.ActiveDocument;
M.ComponentSet mCompSet = mDoc.ComponentSet;

M.Drawing d = (M.Drawing)mCompSet["OutputCoordsSwapped"];
for(int i = 0; i < d.ObjectSet.GeomSet.Count; i++){
M.Geom g = ((M.Geom)d.ObjectSet.GeomSet.get_Item(i));
M.BranchSet bs = g.get_BranchSet();
for(int n = 0; n < bs.Count; n++){
M.PointSet ps = bs.get_Item(n).get_PointSet();
for(int m = 0; m < ps.Count; m++){
M.Point p = ps.get_Item(m);
double currentX = p.X;
double currentY = p.Y;
p.X = currentY;
p.Y = currentX;
}
}
mApp.StatusText = i.ToString() + " of " + d.ObjectSet.Count.ToString();
}
mApp.StatusText = "Coord swap finished.";
}


Właściwie cała 'logika' podmiany współrzędnych zamknięta jest w pętli for po geometrii kompoenentu wektorowego i wewnętrznej for po elementach geometrii no i jeszcze jednej po werteksachDominik Mikiewicz edytował(a) ten post dnia 14.03.12 o godzinie 14:41
Dominik Mikiewicz

Dominik Mikiewicz maps made easy,
www.cartomatic.pl ||
cartoninjas.net

Temat: Odwrócenie współrzędnych X, Y

Jeszcze mała ciekawostka ;-) Skrypt powyżej mieli 30k prostych obiektów w 3:41. Shape waży koło 70MB. Czyli w miarę podobnie do skryptu Marcina.

Zasadniczo dostęp do obiektów przez model jest raczej wolny.

Kod poniżej robi to samo w 0:04 ;-)


SELECT
[ID],
AllBranches([GeomData]) AS [GeomData]
FROM (
SELECT
Max([ID]) AS [ID],
ConvertToArea(
AllCoords(AssignCoordSys(
NewPoint(Y, X), -- invert coords here
CoordSys("Latitude / Longitude")
)
)) as [GeomData] FROM (
SELECT [ID], [B], MaxX([C]) as X, MaxY([C]) as Y
FROM (
SELECT
[ID],
[B]
FROM
[OutputClearedCoordsToBeSwapped]
SPLIT BY Branches([ID]) AS [B]
)
SPLIT BY Coords([B]) AS [C]
)
GROUP BY [B]
)
GROUP BY [ID]
Piotr T.

Piotr T. programista GIS,
analityk GIS,
(www.cgis.pl)

Temat: Odwrócenie współrzędnych X, Y

Panowie, bardzo woooooooolno.

1. Nie musiałem pisać żadnego skryptu
2. 9.4 mln rekordów, sama geometria w shp 1.9GB, realne dane działek

poniżej 1sek.

;)

konto usunięte

Temat: Odwrócenie współrzędnych X, Y

Albo masz bardzo szybki HDD, albo RAM Piotr ;) Kopiowanie takiego shp zajmie więcej, bez odwracania XY ;)))
Piotr T.

Piotr T. programista GIS,
analityk GIS,
(www.cgis.pl)

Temat: Odwrócenie współrzędnych X, Y

Krzysztof Lemańczyk:
Albo masz bardzo szybki HDD, albo RAM Piotr ;) Kopiowanie takiego shp zajmie więcej, bez odwracania XY ;)))

Żeby nie było, że to farma serwerów robiła ;))

Wczytanie shp do programu (2.14 GB): 6:33 (muszę sprawdzić czemu tak długo)
Zamiana: poniżej 0:01
Zapis: 0:50

Inne programy też muszą przecież jakoś wczytać i zapisać ;) Co do komputera to zwykły konsumencki dysk 7200 SATA2, najsłabszy XEON 3440 no i 8GB przyzwoitej pamięci 1600, chipset P55.Piotr Tracz edytował(a) ten post dnia 14.03.12 o godzinie 17:00
Dominik Mikiewicz

Dominik Mikiewicz maps made easy,
www.cartomatic.pl ||
cartoninjas.net

Temat: Odwrócenie współrzędnych X, Y

znaczy się masz najlepsze narzędzie :-)

konto usunięte

Temat: Odwrócenie współrzędnych X, Y

Piotr Tracz:
Żeby nie było, że to farma serwerów robiła ;))

Dzięki Piotr. Wiem, że wiesz, że ja wiedziałem, że piszesz o samym meritum ;) ale teraz dla każdego jest jasne, że Geoxa wymiata :)
Karol Stachura

Karol Stachura Nie ma na świecie
rzeczy niemożliwych
- są tylko mało
pra...

Temat: Odwrócenie współrzędnych X, Y

Żeby coś porównywać trzeba mieć takie same dane wzorcowe i ustalić zasady - na przykład od czasu rozpoczęcia przetwarzania do gotowego pliku wyjściowego. Wtedy można by zrobić mały konkurs, kto co kiedy i jak szybko. Nie chodzi przecież o czas samej zamiany ale czas otrzymania gotowego przetworzonego pliku z pliku źródłowego. :):)



Wyślij zaproszenie do