-1

I've been trying to create random points to sample some locations based, at first, on a field which contains the number of samples I want.
But when I tried at first, in almost every feature it was sampled less than the number of the field.

Then, I tested another way: since I was writting inside a loop through cursor, and one of the fields of the cursor was the area in hectares, and the number of samples is based on the area of the feature, I decided to calculate out of the field the number of samples, but the result was the same.

Then, I was wondering what could cause this problem, it was when I decided to try to run the function with the minimum_distance parameter set to zero, and it worked!

Apparently, what happened is that when I run the function with the minimum_distance parameter, if a random point falls near another point within the minimum distance, the point is removed and I cannot get the total number of samples I need.

Here is the part of the code:

        if 16 <= x[1] < 25:
            minimum_distance = 100
        elif x[1] > 25:
            minimum_distance = 150
        else:
            minimum_distance = 0

        number_of_samples = int(x[1]/8)
        if number_of_samples == 0:
            number_of_samples = 1
        print(number_of_samples)
        arcpy.CreateRandomPoints_management(out_path=arcpy.env.workspace,
                                            out_name='samples_{}'.format(x[0]),
                                            constraining_feature_class=negBuf_tal,
                                            number_of_points_or_field=number_of_samples,
                                            minimum_allowed_distance=minimum_distance)

Where:

x[0]: unique code of feature (inside a loop through cursor);
x[1]: Area in hectares of feature (inside a loop through cursor);
negBuf_tal: negative buffer area of the feature which the loop is going through (to avoid sampling on borders).
OBS: If after the negative buffer the area "desappears", the area to sample in becomes the area without the buffer itself.

How can I solve this without having to write a while structure or something like this?

1 Answer 1

-1

Since I had to hurry to finish my project, I decided to write the code into a loop while, using the arcpy.Near_analysis() function, even though it has increased some lines to the code.
Here is my solution to this problem (if anyone needs the full code to have a better understanding, I can provide, just add a comment, otherwise in this solution there is only a part of the code):

        if 16 <= x[1] < 25:
            minimum_distance = 100
        elif x[1] > 25:
            minimum_distance = 150
        else:
            minimum_distance = 0

        number_of_samples = int(x[1]/8)
        if number_of_samples == 0:
            number_of_samples = 1
        print(number_of_samples)

        list_of_pts = []
        dif = -1
        c = 1
        while dif != 0:
            if dif == -1:
                number_of_samples = number_of_samples
                arcpy.CreateRandomPoints_management(out_path=arcpy.env.workspace,
                                                    out_name='samples_{}_{}'.format(x[0], c),
                                                    constraining_feature_class=negBuf_tal,
                                                    number_of_points_or_field=number_of_samples,
                                                    minimum_allowed_distance=minimum_distance)

                count_sample = arcpy.GetCount_management('samples_{}_{}'.format(x[0], c))
                dif = number_of_samples - int(count_sample.getOutput(0))
            else:
                number_of_samples = dif
                near = True
                while near:
                    arcpy.CreateRandomPoints_management(out_path=arcpy.env.workspace,
                                                        out_name='samples_{}_{}'.format(x[0], c),
                                                        constraining_feature_class=negBuf_tal,
                                                        number_of_points_or_field=number_of_samples,
                                                        minimum_allowed_distance=minimum_distance)

                    arcpy.Near_analysis('samples_{}_{}'.format(x[0], c), list_of_pts, minimum_distance)
                    with arcpy.da.SearchCursor('samples_{}_{}'.format(x[0], c), "NEAR_FID") as near_cursor:
                        for y in near_cursor:
                            if y[0] != -1:
                                near = True
                                break
                            else:
                                near = False

                count_sample = arcpy.GetCount_management('samples_{}_{}'.format(x[0], c))
                dif = number_of_samples - int(count_sample.getOutput(0))

            samples_tmp = 'samples_{}_{}'.format(x[0], c)
            list_of_pts.append(samples_tmp)
            c = c + 1
        arcpy.Merge_management(list_of_pts, 'samples_{}'.format(x[0]))

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.