Jak prosto zserializować SVG?

0

Mam plik svg, który ma typowe

<rect height="101.96577" width="7.91506" y="392.34386" x="711.16066" />

Zastanawiam się czy jest jakiś prosty sposób, żeby zamienić jego reprezentację {width, height, x, y} na zestaw 4ech punktów wielokąta? Tak żebym dostał [{x,y},{x,y},{x,y},{x,y}].

Oczywiście oprócz ręcznego mapowania? Chciałbym żęby brało pod uwagę również transform, translate i rotate().

Coś jak taki renderer SVG do rastrowego formatu, tylko żeby zamiast tworzyć obrazek, stworzyło mi zserializowane dane które mogę odczytać?

0

Może to być też jakiś tool "SVG inspect" który pozwoli mi odczytać wierzchołki elementów.

0

Tylko nie do końca rozumiem gdzie / jak / po co?

Jeżeli w PHP to przecież wystarczy albo regexp, albo jakaś analiza DOM i wyciąganie wartości atrybutów. Tu nie trzeba super narzędzia, tylko godzina czasu + PHP.

https://www.php.net/manual/en/book.dom.php

1

SVG jest oparte na XML, więc można by użyć parsera XMLa i odczytywać te dane "na pałę", liczyć sobie te punkty.

Pytanie tylko, czy w SVG nie ma żadnych sytuacji szczególnych, gdzie odczytywanie "na pałę" mogłoby zwrócić błędne wyniki?

(jak rozumiem, chcesz, żeby również brał pod uwagę transform, translate i rotate, a to może być potencjalnie dość brudna robota, żeby obsłużyć wszystkie rodzaje takich udziwnień).

Aha, to co napisałeś - żeby zamienić jego reprezentację {width, height, x, y} na zestaw 4ech punktów wielokąta? Tak żebym dostał [{x,y},{x,y},{x,y},{x,y}]. przypomina mi geojson. Może więc spróbować poszukać biblioteki konwertującej SVG do Geojson?

0
TomRZ napisał(a):

Tylko nie do końca rozumiem gdzie / jak / po co?

Jeżeli w PHP to przecież wystarczy albo regexp, albo jakaś analiza DOM i wyciąganie wartości atrybutów. Tu nie trzeba super narzędzia, tylko godzina czasu + PHP.

https://www.php.net/manual/en/book.dom.php

Oczywiście, to nie jest taka prosta sprawa żeby zamienić {width,height,x,y} na punkty wielokąta, przez specyfikę SVG. Są transformacje, obroty, viewporty, layer'y, origin pointy, i masa innych rzeczy. Dlatego szukam gotowego rozwiązania.

LukeJL napisał(a):

Pytanie tylko, czy w SVG nie ma żadnych sytuacji szczególnych, gdzie odczytywanie "na pałę" mogłoby zwrócić błędne wyniki?

No oczywiście że są.

(jak rozumiem, chcesz, żeby również brał pod uwagę transform, translate i rotate, a to może być potencjalnie dość brudna robota, żeby obsłużyć wszystkie rodzaje takich udziwnień).
Aha, to co napisałeś - żeby zamienić jego reprezentację {width, height, x, y} na zestaw 4ech punktów wielokąta? Tak żebym dostał [{x,y},{x,y},{x,y},{x,y}]. przypomina mi geojson. Może więc spróbować poszukać biblioteki konwertującej SVG do Geojson?

Noi dlatego szukam gotowego rozwiązania pod SVG.

2

Jak to nie jest jakiś standard to raczej będzie ciężko o pasujące do twoich wymagań rozwiązanie. Może napisz coś więcej o problemie jak próbujesz rozwiązać

0
UglyMan napisał(a):

Jak to nie jest jakiś standard to raczej będzie ciężko o pasujące do twoich wymagań rozwiązanie. Może napisz coś więcej o problemie jak próbujesz rozwiązać

Standard to SVG.

0

Chodzi mi o dane wyjściowe

0
UglyMan napisał(a):

Chodzi mi o dane wyjściowe

Jedyne co chcę dostać to współrzędne każdego wierzchołka względem 0,0.

2

Dla potomnych, można to zrobić przy użyciu https://pypi.org/project/svgelements/. To jest libka do budowania i renderowania SVG, ale umie też parsować. Bierze pod uwage viewport, translate, transform, scale, rotate, i wszystko pozostałe.

from io import StringIO
from svgelements import SVG, Rect, Path, Close


def inspect(svg_xml: str) -> dict:
    svg = SVG.parse(StringIO(svg_xml))

    return {
        'width': int(round(svg.width)),
        'height': int(round(svg.height)),
        'vertices': [vertices(element) for element in svg.objects.values() if type(element) is Rect]
    }

def vertices(rectangle: Rect) -> dict:
    return [{'x': line.end.x, 'y': line.end.y} for line in Path(rectangle.segments()) if type(line) is not Close]

1 użytkowników online, w tym zalogowanych: 0, gości: 1