0

PostgreSQL は幾何学的な型をサポートしており、私はそれらでいっぱいのデータベースを持っています。DBIx:Class で Perl を使用してそれらを取得したいと考えています。

たとえば、ポイント タイプは '(x,y)' として定義され、DBIx::Class がそれを取得する方法です。文字列として。

これを配列または他のより具体的なデータ型に解析したいと思います。

私の現在の解析の試みには、角かっこを取り除いてから分割することが含まれていましたが、これはポイントではうまく機能しますが、ポリゴンでは機能しません:

(( x1 , y1 ) , ... , ( xn , yn ))
( x1 , y1 ) , ... , ( xn , yn )
( x1 , y1   , ... ,   xn , yn )
  x1 , y1   , ... ,   xn , yn

次に考えたのは ( を [ に置き換えてから JSON を解析することでしたが、これもうまくいきませんでした。

よりクリーンな解析方法に関する提案はありますか?

ありがとう

PostgreSQL ジオメトリの詳細

4

1 に答える 1

0
### First Option - just replace ( with ] and eval it as arrays of array
sub parsePolyEval {
        my $polyString = shift;
    $polyString =~ s/\(/\[/g;
    $polyString =~ s/\)/\]/g;

    return eval($polyString);
}

### Second option - parse inner arrays. Assuming That a polygon consists of lists of     points (level 2 array), and not defined recursivley
sub parsePolySPlit {
    my $polyString = shift;
    my @polyArray;
    my @subArrays = ($polyString =~ /\(([^\)\()]+)\)/g);

    foreach (@subArrays) {
        my @subArray = split(/[\s\,]+/,$_);
        @subArray = grep  {$_ ne ""} @subArray; ##ignore empty elements caused by spaces
        push(@polyArray,\@subArray);
    }

    return \@polyArray;
}

sub printPoly {
    my $poly = shift;
    my $i=0;
    foreach (@$poly) {
         print "Point number $i is: ".join("|",@$_)."\n";
        $i++;
        }
}

my $polyString = "(( x1 , y1 ) ,( x2 , y3 ) , ( xn , yn ))";

my $poly1 = parsePolyEval($polyString);
printPoly($poly1);
my $poly2 = parsePolySPlit($polyString);
printPoly($poly2);
于 2013-03-13T23:41:45.610 に答える