Zhušťování
Zhušťování hranic polygonů nebo segmentů polylinií je běžný úkol.
V předchozí verzi jsem psal o zhušťování geometrie na základě „faktoru“, tedy zdvojnásobení, ztrojnásobení... počtu bodů podél segmentu.
Plánární zhušťování lze provádět v Nástrojích pro úpravy s několika možnostmi. Je nedostupné na úrovni základní licence z nějakého důvodu.
Zhušťování (úpravy)—ArcGIS Pro | Dokumentace
Tento text se zaměřuje na zhušťování založené na plánárním kroku vzdálenosti podél čáry/obvodu. Je to nejběžnější použití.
Bude zahrnovat několik mých nástrojových sad (uvedených níže).
Kód ilustruje sílu numpy v geoprocesingu.
def _pnts_on_line_(a, spacing=1, is_percent=False): # zhušťování podle vzdálenosti
"""Přidat body v pevně daném rozestupu do pole reprezentujícího čáru.
Parametry
----------
a : pole
Sekvence `bodů`, párů x,y, reprezentujících hranice polygonu
nebo objekt polylinie.
spacing : číslo
Rozestup mezi body, které mají být přidány na čáru.
is_percent : boolean
Vyjádřit zhušťování jako procento z celkové délky.
"""
a = _get_base_(a)
N = len(a) - 1 # segmenty
dxdy = a[1:, :] - a[:-1, :] # rozdíly souřadnic
leng = np.sqrt(np.einsum('ij,ij->i', dxdy, dxdy)) # délky segmentů
if is_percent: # jako procento
spacing = abs(spacing)
spacing = min(spacing / 100, 1.)
steps = (sum(leng) * spacing) / leng # krok vzdálenosti
else:
steps = leng / spacing # krok vzdálenosti
deltas = dxdy / (steps.reshape(-1, 1)) # kroky souřadnic
pnts = np.empty((N,), dtype='O') # vytvořit pole typu `O`
for i in range(N): # projít segmenty a vytvořit
num = np.arange(steps[i]) # nové body
pnts[i] = np.array((num, num)).T * deltas[i] + a[i]
a0 = a[-1].reshape(1, -1) # přidat poslední bod a spojit
return np.concatenate((*pnts, a0), axis=0)
Myslím, že mé oblíbené jsou tyto 2 řádky ...
dxdy = a[1:, :] - a[:-1, :] # rozdíly souřadnic
leng = np.sqrt(np.einsum('ij,ij->i', dxdy, dxdy)) # délky segmentů
Einstein byl chytrý chlapík.
Jeho notace je implementována v mnoha jazycích a způsobuje zmatení, dokud si na ni nezvyknete (téma pro jiný blog).
Stručně řečeno, dxdy představuje sekvenční rozdíly v souřadnicích pole (čtěte souřadnice polygonu/polylinie).
Nemusíte číst geometrii a odečítat každou x a y souřadnici zvlášť. Jeden řádek a máte hotovo.
Teď a[1:, :] znamená od druhého páru souřadnic dále a a[:-1, :] znamená od prvního páru až po předposlední (indexování začíná od nuly).
Máte pocit zmatení? Používáte Pandas nebo shapely, příliš dlouho.
Takto vypadá jednoduchý polygon reprezentovaný jako pole (dokonce i arcpy.Array)
a # ---- pole x, y souřadnic... první a poslední jsou stejné
array([[ 0.00, 0.00],
[ 2.00, 8.00],
[ 8.00, 10.00],
[ 10.00, 10.00],
[ 10.00, 8.00],
[ 9.00, 1.00],
[ 0.00, 0.00]])
dxdy # ---- sekvenční delta x a delta y mezi páry
array([[ 2.00, 8.00],
[ 6.00, 2.00],
[ 2.00, 0.00],
[ 0.00, -2.00],
[ -1.00, -7.00],
[ -9.00, -1.00]])
leng # ---- vzdálenost mezi páry bodů
array([ 8.25, 6.32, 2.00, 2.00, 7.07, 9.06])
Teď když je kouzlo hotové, zbytek je jen věc rozhodnout se zda chcete zhušťovat podle absolutní vzdálenosti nebo jako procento z celkové vzdálenosti.