কোনও ভেক্টর ডেটাসেটে কীভাবে সমস্ত বৈশিষ্ট্য সহজেই স্থানান্তরিত হয়?


33

ধরা যাক যে আমি একটি শেপফিল একসাথে রেখেছি এবং সমস্ত বৈশিষ্ট্যগুলির স্থির পরিমাণে তাদের উল্লম্ব স্থানান্তরিত হয়। একটি স্বেচ্ছাসেবী শিফট দ্বারা সমস্ত বৈশিষ্ট্যগুলি (তার শিখরের (x, y) অবস্থান ) স্থানান্তরিত করার সহজতম উপায় কী ? আমার কাছে প্রচুর ফাইল রয়েছে যা আমি এই সংশোধনটি প্রয়োগ করব, সুতরাং একটি বাশ / ওজিআর উত্তর পছন্দ করা হবে :)

অবশেষে, আমি এটির জন্য স্প্যাটিয়ালাইট ব্যবহার করে শেষ করেছি কারণ এটির দুর্দান্ত কার্য রয়েছে ShiftCoords। তবে থ্রেডটি খুব তথ্যপূর্ণ ছিল! সবাইকে ধন্যবাদ!


আমি শুধু এই এন্ট্রি পছন্দ। এই পুরো পৃষ্ঠাটি প্রশ্নোত্তর ডানদিকে চলে যাওয়ার দুর্দান্ত উদাহরণ। একটি সরল স্পষ্টভাবে বর্ণিত প্রশ্ন এবং প্রতিটি উত্তর একটি অনন্য, বৈধ এবং সম্পূর্ণ সমাধান দেয়। ইহা সুন্দর. আমি প্রত্যেককেই নিজের যোগ্যতায় উন্নীত করেছি।
ম্যাট উইলকি

@ জোস জিডিএল লাইব্রেরির তুলনামূলকভাবে সাম্প্রতিক বর্ধনের কারণে এই পোস্টটির সামান্য আপডেটের প্রয়োজন। এখন একটি লাইনারের সমাধান রয়েছে (নীচের উত্তরটি দেখুন)! Ogr2ogr ইউটিলিটি দিয়ে সরাসরি স্প্যাটিয়ালিট শিফটকর্ডস ফাংশন ব্যবহার করা সম্ভব।
আন্তোনিও ফ্যালকিয়ানো

উত্তর:


21

জেইকিউএল ব্যবহার করে এটি তিনটি লাইন দিয়ে করা যেতে পারে:

ShapefileReader t file: "shapefile.shp";
out = select * except (GEOMETRY), Geom.translate(GEOMETRY,100,100) from t;
ShapefileWriter out file: "ahapefile_shift.shp";

কাটিয়া প্রান্ত! চমৎকার!
ওল্ফড্রেড

ভাল, ডেভিড। টাইট।
সাগিলিজ

1
শুধু উল্লেখ করতে হবে ... "আহেফাইল?"
উল্ফড্রেড

আমি স্প্যাটালাইটের অনুবাদ ফাংশনটি ব্যবহার করে শেষ করেছি, যা আপনি এখানে পরামর্শ মতো করেন similar
জোসে

30

এই ধরণের প্রসেসিং সহজ করার জন্য আমি ফিয়োনা (একটি ওজিআর র্যাপার) ডিজাইন করেছি ।

from fiona import collection
import logging

log = logging.getLogger()

# A few functions to shift coords. They call eachother semi-recursively.
def shiftCoords_Point(coords, delta):
    # delta is a (delta_x, delta_y [, delta_y]) tuple
    return tuple(c + d for c, d in zip(coords, delta))

def shiftCoords_LineString(coords, delta):
    return list(shiftCoords_Point(pt_coords, delta) for pt_coords in coords)

def shiftCoords_Polygon(coords, delta):
    return list(
        shiftCoords_LineString(ring_coords, delta) for ring_coords in coords)

# We'll use a map of these functions in the processing code below.
shifters = {
    'Point': shiftCoords_Point,
    'LineString': shiftCoords_LineString,
    'Polygon': shiftCoords_Polygon }

# Example 2D shift, 1 unit eastward and northward
delta = (1.0, 1.0)

with collection("original.shp", "r") as source:

    # Create a sink for processed features with the same format and 
    # coordinate reference system as the source.
    with collection(
            "shifted.shp", 
            "w",
            driver=source.driver,
            schema=source.schema,
            crs=source.crs
            ) as sink:

        for rec in source:
            try:
                g = rec['geometry']
                g['coordinates'] = shifters[g['type']](
                    g['coordinates'], delta )
                rec['geometry'] = g
                sink.write(rec)
            except Exception, e:
                log.exception("Error processing record %s:", rec)

আপডেট : আমি http://sgillies.net/blog/1128/geoprocessing-for- Shiters-translating-features এ এই স্ক্রিপ্টটির একটি আলাদা, শক্ত সংস্করণ রেখেছি ।


2
"হিপস্টারদের ভূ-প্রসেসিং" আমি আশা করি আমি সেই দুর্দান্ত দশকের জন্য কেবল 10x উপস্থাপন করতে
পারতাম

13

যদিও পোস্টটি অজগর দিয়ে ট্যাগ করা হয়েছে, যেহেতু জেইকিউএল ইতিমধ্যে উল্লেখ করা হয়েছে, এখানে জাভাস্ক্রিপ্টের একটি উদাহরণ রয়েছে ( জিওস্ক্রিপ্ট ব্যবহার করে )।

/**
 * Shift all coords in all features for all layers in some directory
 */

var Directory = require("geoscript/workspace").Directory;
var Layer = require("geoscript/layer").Layer;

// offset for all geometry coords
var dx = dy = 10;

var dir = Directory("./data");
dir.names.forEach(function(name) {
    var orig = dir.get(name);
    var shifted = Layer({
        schema: orig.schema.clone({name: name + "-shifted"})
    });
    orig.features.forEach(function(feature) {
        var clone = feature.clone();
        clone.geometry = feature.geometry.transform({dx: dx, dy: dy});
        shifted.add(clone);
    });
    dir.add(shifted);
});

13

এসকিউএলাইট এবং স্প্যাটিয়ালাইটের সাথে সংকলিত জিডিএল> = 1.10.0 ব্যবহার করে:

ogr2ogr data_shifted.shp data.shp -dialect sqlite -sql "SELECT ShiftCoords(geometry,1,10) FROM data"

যেখানে শিফটএক্স = 1 এবং শিফটওয়াই = 10।


1
উজ্জ্বল - একটি সাধারণ এক লাইন সিএলআই সমাধান।
ডেভ এক্স

সংক্ষিপ্ত এবং সহজ!
কুর্ট

8

গ্রাস জিআইএস ভি.এডিট মডিউল :

মিলের অভিক্ষেপে একটি বিদ্যমান অবস্থান এবং মানচিত্রটি ধরে নেওয়া হয়।

শেল স্ক্রিপ্টে:

#!/bin/bash

for file in `ls | grep \.shp$ | sed 's/\.shp$//g'`
do
    v.in.ogr dsn=./${file}.shp output=$file
    v.edit map=$file tool=move move=1,1 where="1=1"
    v.out.ogr input=$file type=point,line,boundary,area dsn=./${file}_edit.shp
done

বা পাইথন লিপিতে:

#!/usr/bin/env python

import os
from grass.script import core as grass

for file in os.listdir("."):
    if file.endswith(".shp"):
        f = file.replace(".shp","")
        grass.run_command("v.in.ogr", dsn=file, output=f)
        grass.run_command("v.edit", map=f, tool="move", move="1,1", where="1=1")
        grass.run_command("v.out.ogr", input=f, type="point,line,boundary,area", dsn="./%s_moved.shp" % f)

8

আর একটি অপশন হ'ল রিগ্রোজেশন অপশনগুলি কেবল ওগ্রো 2 জিআর-তে ব্যবহার করা, অবশ্যই জেইকিউএল, ফিয়োনা বা জিওস্ক্রিপ্টের পদ্ধতির চেয়ে কোনও হ্যাকিয়র পদ্ধতির চেয়ে কম কার্যকর নয়। মনে রাখবেন যে প্রজেকশনগুলি থেকে আসা এবং আসার আগে পর্যন্ত আসল প্রকৃতিটির প্রকৃত অভিক্ষেপ হওয়ার দরকার নেই যতক্ষণ না s_srs এবং t_srs এ ব্যবহৃত অনুমানগুলির মধ্যে একমাত্র জিনিসটি পরিবর্তিত হয় তা ভুয়া পূর্বাভাস এবং ন্যোরথিং। এই উদাহরণে আমি কেবল গুগল মার্কেটর ব্যবহার করছি। আমি নিশ্চিত যে বেস হিসাবে ব্যবহার করার জন্য অনেক সহজ সমন্বয় ব্যবস্থা রয়েছে তবে অনুলিপি / পেস্ট করার জন্য এইটি আমার সামনে ছিল।

ogr2ogr -s_srs EPSG:900913 -t_srs 'PROJCS["Google Mercator",GEOGCS["WGS 84",DATUM["World Geodetic System 1984",SPHEROID["WGS 84",6378137.0,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0.0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.017453292519943295],AXIS["Geodetic latitude",NORTH],AXIS["Geodetic longitude",EAST],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["semi_minor",6378137.0],PARAMETER["latitude_of_origin",0.0],PARAMETER["central_meridian",0.0],PARAMETER["scale_factor",1.0],PARAMETER["false_easting",1000.0],PARAMETER["false_northing",1000.0],UNIT["m",1.0],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","900913"]]' -f "ESRI Shapefile" shift.shp original.shp

বা টাইপিং / পেস্টিং সংরক্ষণ করতে, নিম্নলিখিতগুলিতে সংরক্ষণ করুন projcs.txt(উপরের মতো, তবে একক উদ্ধৃতি সংযুক্ত করে):

-s_srs EPSG:900913 -t_srs PROJCS["Google Mercator",GEOGCS["WGS 84",DATUM["World Geodetic System 1984",SPHEROID["WGS 84",6378137.0,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0.0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.017453292519943295],AXIS["Geodetic latitude",NORTH],AXIS["Geodetic longitude",EAST],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["semi_minor",6378137.0],PARAMETER["latitude_of_origin",0.0],PARAMETER["central_meridian",0.0],PARAMETER["scale_factor",1.0],PARAMETER["false_easting",1000.0],PARAMETER["false_northing",1000.0],UNIT["m",1.0],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","900913"]]

এবং তারপরে চালান:

ogr2ogr --optfile projcs.txt shifted.shp input.shp

2
এটি ভূ-স্ক্রিপ্টিং গল্ফে পরিণত হচ্ছে! পরবর্তী পদক্ষেপটি হ'ল দীর্ঘ EPGGS কে অপসারণের জন্য আপনার EPSG টেবিলটি হ্যাক করা হবে;)
সাগিলি 6:58

@ সিসিলিগুলি, ইপিএসজি হ্যাক করার দরকার নেই, কেবল একটি ফাইলের জন্য প্রজ্যাকগুলি সংরক্ষণ করুন এবং --optfileযেমন, উদাহরণস্বরূপ ogr2ogr --optfile projcs.txt shifted.shp input.shp। আমি উত্তরে ভাঁজ করব।
ম্যাট উইলকি

7

প্যাকেজ মানচিত্রগুলি এবং এর এলিড ফাংশন ব্যবহার করে একটি আর বিকল্প:

shift.xy <- c(1, 2)
library(maptools)
files <- list.files(pattern = "shp$")
for (fi in files) {
  xx <- readShapeSpatial(fi)
  ## update the geometry with elide arguments
  shifted <- elide(xx, shift = shift.xy)
  ## write out a new shapfile
  writeSpatialShape(shifted, paste("shifted", fi, sep = ""))
}

4

জিওফিউনকশনে শেফফাইল পার্সার ব্যবহার করে আপনি প্রসেসটি সম্পাদন করতে এক্সএসএলটি ব্যবহার করতে পারেন। অবশ্যই আপনাকে পরে শেফফাইলে রূপান্তর করতে হবে :-)।

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0" xmlns:gml="http://www.opengis.net/gml">
    <xsl:param name="x_shift" select="0.0"/>
    <xsl:param name="y_shift" select="0.0"/>

    <!-- first the identity transform makes sure everything gets copied -->
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <!-- for any element with coordinate strings, apply the translation factors -->
    <!-- note that a schema-aware processor could use the schema type names to simplify -->
    <xsl:template match="gml:pos|gml:posList|gml:lowerCorner|gml:upperCorner">
        <xsl:copy>
            <!-- this xpath parses the ordinates, assuming x y ordering (shapefiles), applies translation factors -->
            <xsl:value-of select="
                for $i in tokenize(.,'\s+') return 
                  if ($i[(position() mod 2) ne 0]) then 
                    number($i)+$x_shift 
                  else 
                    number($i)+$y_shift
             "/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

4

এখানে গ্রোভির জিওস্ক্রিপ্ট সংস্করণ রয়েছে:

import geoscript.workspace.Directory
import geoscript.layer.Layer

int dx = 10
int dy = 10

def dir = new Directory("./data")
dir.layers.each{name ->
    def orig = dir.get(name)
    def shifted = dir.create("${name}-shifted", orig.schema.fields)
    shifted.add(orig.cursor.collect{f ->
        f.geom = f.geom.translate(dx, dy)
        f
    })
}  

0

এখানে ওজিআর সংস্করণ

ড্রাইভার = ogr.GetDriverByName ("ESRI শেফিল")

ডিএফ মুভ (ডিএক্স, ডাই, ডিজেড):

dataSource = driver.Open(path,1)
layer = dataSource.GetLayer(0)
for feature in layer:
    get_poly = feature.GetGeometryRef()
    get_ring = get_poly.GetGeometryRef(0)
    points   = get_ring.GetPointCount()
    set_ring = ogr.Geometry(ogr.wkbLinearRing)
    for p in xrange(points):
        x,y,z = get_ring.GetPoint(p)
        x += dx
        y += dy
        z += dz
        set_ring.AddPoint(x,y)
        print x,y,z
set_poly = ogr.Geometry(ogr.wkbPolygon)
set_poly.AddGeometry(set_ring)

feature.SetGeometry(set_poly)
layer.SetFeature(feature)

del layer
del feature
del dataSource   
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.