Daha çox

Python tampon nöqtələri və xətt seqmentli klip (OS Open Roads in BNG)

Python tampon nöqtələri və xətt seqmentli klip (OS Open Roads in BNG)


Tamponlamaq və həll etmək (çoxbucaqlı) etmək, sonra Ordnance Survey Açıq Yollarını (BNG -də proqnozlaşdırılan) həmin çoxbucaqlı ilə kəsmək və nəticələri ixrac etmək istədiyim bir sıra nöqtələr (enlik, uzunluq koordinatları) var.

Qeyd: Şəkil məlumatlarının heç birini qorumaqla maraqlanmıram -> Sadəcə çoxbucağımın içərisində mümkün qədər səmərəli bir xətt göstərmək üçün yol şəbəkəsini təsirli şəkildə kəsmək istəyirəm.


Tam olaraq nə etməyə çalışırsınız?

Ssenarinizin birinci hissəsi sizə EPSG: 3857 (Google Mercator deyil, WGS84) ilə MultiPoint həndəsəsini verir.

1) orijinal csv faylını oxuyun və ortaya çıxan şəkil faylını yazın

csv idxalından DictReader -dən şekil.geometri idxal Nöqtəsindən, # unary_unionun xəritələndirilməsi indi formalı.ops -dan üstünlük təşkil edir. union_union idxal fiona -dan fiona.crs idxalı idxalı # csv faylını sadə lüğətlərin siyahısı olaraq açın pts = [Point (float (pt) ['X']), float (pt ['Y'])) pict for pict for DictReader (open ("test.csv"), delimiter = ",")] buffer = [point.buffer (0.001) in point pts] merged = unary_union (buffer) # forma faylını fiona.open ilə Fiona ilə saxla ("some_union.shp", "w", driver = "ESRI Shapefile", crs = from_epsg (3857), schema = schema) kimi çıxış: output.write ({'həndəsə': eşleme (birləşdirildi), 'xassələr': {'id': 123}})

2) proyeksiyanı dəyişdirin

İngiltərə yol şəbəkəsinin proyeksiyası OSGB36: EPSG7405 -dir.

Çoxbucaqlılarınızın proyeksiyasını İngiltərənin yol şəbəkəsinin proyeksiyasına və ya buferdən əvvəl nöqtələrin proyeksiyasına çevirməlisiniz. Bunun üçün pyproj modulundan (R proj4 paketi ilə eyni) və ya osgeo.GDAL modulundan (rgdal ilə eyni) istifadə edə bilərsiniz -> bax, məsələn, pyproj, şekilli və Fiona ilə çoxbucaqlı koordinatları çevirin).

3) xətləri və çoxbucaqları kəsin

Fiona və Shapely ilə Line və Polygon kəsişmə koordinatlarına baxın


@Gene - kömək üçün çox sağ olun! İnanılmaz dərəcədə faydalıdır. Özümü yaxın hiss edirəm, amma yenə də bir az mübarizə aparıram.

Sualınıza cavab vermək üçün -> Google Distance Matrix API -dən bir yerdən 10 dəqiqəlik məsafədə olan nöqtələrin siyahısını çıxarıram (60 millik sürücüyə əsaslanan məhdud bir dairədə qurulmuş bir şəbəkədəki bütün nöqtələri sorğulayaraq). Sonra bu nöqtələri tamponlayıram və çoxbucağa qoşuluram.

Böyük Britaniyanın yol şəbəkəsini yükləmək və sonra çoxbucaqlı əraziyə düşən yolları kəsmək istəyirəm (çoxbucaqlı ilə xəttin kəsişməsinin bir nöqtəsi olacağını düşündüyümü düşünürəm, amma xətti kəsmək istəyirəm) .

Aşağıdakı kod HORRIBLY yavaş işləyir. İngiltərənin bütün yol şəbəkəsini saniyələrdə arcGIS ilə kəsə bilərəm. Ancaq burada kiçik bir alt nümunə təxminən 20 dəqiqə çəkdi? Yedəkləmə seçimim bir R-sarıcı qurmaq və gIntersection-a zəng etməkdir, lakin bu da daha yavaşdır:

# Kəsişmiş nöqtələrin forma faylını yaradın = [] # Qeyd: csv.reader (f): x-də x: for f: x [2]) <= 10: # Bu mərhələdə nöqtələri dəyişdirin pts.append (Point (float (x [1]), float (x [0])))) point in pts] merged = unary_union (buffer) # Şəkil faylını Fiona sxemi ilə saxla = {'geometry': 'Polygon', 'properties': {'id': 'int'},} with fiona.open ("H: /polygon_out.shp "," w ", driver =" ESRI Shapefile ", crs = from_epsg (4326), schema = schema) output: output.write ({'geometry': mapping (merged), 'properties': {) 'id': 123}}) input_shp = my_roads_shape clipping_shp = product_poly_shape output_shp = "H: /my_cropped_output.shp" subprocess subccess.call (["C:  Program Files  GDAL  ogr2ogr", "-f", "ESRI Shapefile "," -clipsrc ", clipping_shp, output_shp, input_shp]) çap et ('Bitti!')

Redaktə et:

C qayçı kitabxanası (pyclipper) üçün bir sarğı tapdım:

idxal pyclipper pc = pyclipper.Pyclipper () # Mövzu olaraq tək bir xətt əlavə edin. pc.AddPath ([( -1, -1), (2, 1)], pyclipper.PT_SUBJECT, False) # Kırpma bölgəsi olaraq bir kvadrat əlavə edin. pc.AddPath ([(0, 0), (1, 0), (1, 1), (0, 1)], pyclipper.PT_CLIP, True) # Düzbucağı istifadə edərək xətti kəsin. həll = pc.Execute2 (pyclipper.CT_INTERSECTION, pyclipper.PFT_NONZERO, pyclipper.PFT_NONZERO) çap (pyclipper.PolyTreeToPaths (həll))

Düşünürdüm ki, bəlkə bu işə başlaya bilərəm?