6

I'm novice in GIS world in python (geopandas, shapely, etc). I need "move" a Multipolygon upwards, but I don't know how to do that.

The Problem

import pandas as pd
import numpy as np
import matplotlib
from matplotlib import pyplot as plt
import seaborn as sns
import pysal as ps
from pysal.contrib.viz import mapping as maps    
import geopandas as gpd

fs = 5
nums = ("renta", 1)

f, ax = plt.subplots(1, figsize=(fs,fs))

spain.plot(column="XBAR", ax=ax, linewidth=0.05, cmap="OrRd", scheme="unique_values")
ax.set_axis_off()

plt.title("RENTA MEDIA", fontsize=20)
plt.tight_layout()

plt.savefig("../imgs/map_%s_%s.svg" % nums, bbox_iches="tight", dpi=2800)
plt.show()

output:

As you can see, Islands "Canarias" are away from rest of Spain, I want a smaller figure, and it's takes account that color is important, it's represent income mean for each counties.

If it's helps:

canarias = spain[spain.ca == "CANARIAS"]["geometry"]
print canarias
print canarias.type

13    (POLYGON ((-17.92791748046875 27.8495826721191...
Name: geometry, dtype: object
13    MultiPolygon
dtype: object

Note: Are counties missing, that's why I don't have data for this counties.

My first attempt was try to change coords of polygon for example, I try to find how to do some like this: canarias.coords + (-3,-4) but I didn't find how to access to coords of multipolygon to do that.

I appreciate any help.

PS: Sorry for my English :-/

mmngreco
  • 516
  • 5
  • 14

1 Answers1

10

I think you are looking for shapely.affinity.translate. From the docs:

Signature: shapely.affinity.translate(geom, xoff=0.0, yoff=0.0, zoff=0.0)
Docstring:
Returns a translated geometry shifted by offsets along each dimension.

The general 3D affine transformation matrix for translation is:

/ 1  0  0 xoff \ 
| 0  1  0 yoff |
| 0  0  1 zoff |
\ 0  0  0   1  /

For your specific example, you can use:

canarias = spain[spain.ca == "CANARIAS"].geometry
canarias_shift = canarias.apply(lambda x: shapely.affinity.translate(x, xoff=-3, yoff=-4))
jdmcbr
  • 5,964
  • 6
  • 28
  • 38
  • Thanks for you answer, yes, this is what I'm looking for. It's works like I expect. May be have a little mistake on last line of code: `affinity` rather `affine`. Many thanks again. bests! – mmngreco Sep 24 '16 at 14:02
  • I could implement it, but this change canarias isolated so how can replace canarias_shift into spain DataFrame? because, `spain[spain.ca == "CANARIAs"].geomery = canarias_shift.geometry` doesn't work. If it's not necessary open another question, of course. – mmngreco Sep 24 '16 at 15:43
  • Yes, thanks for the catch on `affinity` rather than `affine` in the last line. I've fixed it. – jdmcbr Sep 24 '16 at 18:12
  • 1
    Try `spain.loc[spain.ca == "CANARIAS", "geometry"] = canarias_shift.geometry`. – jdmcbr Sep 24 '16 at 18:14
  • Awsome, now looks just I want! Thanks a lot, it was very helpful. – mmngreco Sep 24 '16 at 18:25