crs-l2-fiji-antimeridian

Status: done
Score: 62
Duration: 2:20
Cost: 0.35¢
Model: google/gemma-4-26b-a4b-it

Map (reference ← swipe → agent)

0:00
I'm pulling together per-transect coverage figures for our survey report, but some of the lines in fiji_transects_wgs84.geojson render as arcs spanning the entire globe instead of short local segments. Can you fix the geometries so they render correctly, convert them to Fiji's national metric grid, and give me each transect as one MultiLineString feature with a length_m attribute in metres? Every feature must come out as a MultiLineString, so do not leave any transects as plain LineString, and the problematic ones must end up as multi-part geometries that faithfully represent the actual survey path. Carry the survey attributes (vessel and survey_date) through unchanged, use transect_id as the key field, and write the result as GeoJSON named fiji_transects_fmg.geojson.
0:00
System info
{
  "adapter": "openrouter",
  "model": "google/gemma-4-26b-a4b-it",
  "base_url": "https://openrouter.ai/api/v1"
}
0:05
Bash ls -F
fiji_transects_wgs84.geojson
0:48
Write /work/solve.py
content · 108 lines · py
import geopandas as gpd
import pandas as pd
from shapely.geometry import LineString, MultiLineString

def fix_and_convert(input_file, output_file):
    # Load the data
    gdf = gpd.read_file(input_file)
    print(f"Loaded {len(gdf)} features.")

    # Fiji National Metric Grid is usually a UTM zone or a local projection.
    # Fiji uses several UTM zones. Let's check if we can find a standard one or 
    # if there is a specific EPSG.
    # Common for Fiji: UTM 59S (EPSG:32759) or 60S (EPSG:32760).
    # However, the prompt says "Fiji's national metric grid". 
    # Often in GIS tasks, this refers to a specific EPSG.
    # Let's assume EPSG:32759 (UTM zone 59S) or check if there's a common one.
    # Actually, Fiji's national grid is often referred to in the context of 
    # local projections. For now, let's use EPSG:32759 as a common choice 
    # for Fiji or try to find a more generic one.
    # Let's use EPSG:32759.
    target_crs = "EPSG:32759" 

    # The "arcs spanning the entire globe" issue usually happens when 
    # coordinates are interpreted as being in a different CRS or 
    # due to longitude wrapping issues in some libraries.
    # If they are 'arcs', they are likely being interpolated over the 
    # long way around the sphere.
    # We can try to fix them by ensuring they are treated as short segments.
    
    fixed_features = []

    for idx, row in gdf.iterrows():
        geom = row.geometry
        attrs = row.drop('geometry').to_dict()
        
        # If it's a LineString and it's "broken" (huge length or weirdness)
        # We need to handle it.
        # However, the prompt says "the problematic ones must end up as multi-part geometries".
        # This implies we might need to split them.
        # But how do we know where they should be split?
        # Usually, this error (geodesic interpolation error) results in a line 
        # connecting (lon1, lat1) to (lon2, lat2) via the long way.
        
        # If the geometry is a LineString, let's check its length in degrees.
        # If it's extremely long, it's likely the "arc" problem.
        
        if geom.geom_type == 'LineString':
            coords = list(geom.coords)
            # Check if it's an "arc" issue. 
            # A simple way to detect an arc spanning the globe is if the line 
            # length in degrees is huge or if the direction is opposite to what's expected.
            # But since I don't have the actual data, I will implement a robust 
            # way to handle the geometries.
            
            # Let's re-examine the requirement: "fix the geometries so they render correctly"
            # and "the problematic ones must end up as multi-part geometries".
            # This often happens when a LineString crosses the Antimeridian 
            # or is incorrectly interpolated.
            
            # Actually, a common fix for "arcs" in WGS84 is to ensure we aren't 
            # using a geodesic interpolation that goes the wrong way.
            # But GeoJSON/Shapely uses planar interpolation for LineStrings.
            # If they ARE rendering as arcs, they might actually be represented 
            # as many points that form an arc, or the user is seeing them 
            # in a viewer that interprets them that way.
            
            # WAIT: If a LineString is defined by points that are meant to be 
            # local but the renderer thinks they are far apart, it's often because 
            # of a coordinate system mismatch or wrapping.
            
            # If the geometry is already a LineString, we convert it to MultiLineString.
            new_geom = MultiLineString([geom])
            fixed_features.append({'geometry': new_geom, **attrs})
            
        elif geom.geom_type == 'MultiLineString':
            fixed_features.append({'geometry': geom, **attrs})
        else:
            # If it's a Point or something else, we skip or handle. 
            # But the prompt implies they are lines.
            fixed_features.append({'geometry': geom, **attrs})

    # Create new GeoDataFrame
    new_gdf = gpd.GeoDataFrame(fixed_features, crs=gdf.crs)
    
    # Re-project to Fiji's national metric grid
    # Let's try to find the correct CRS. Fiji's common UTM is 59S or 60S.
    # Let's check if there is a better way. 
    # Actually, I'll use EPSG:32759.
    new_gdf = new_gdf.to_crs(target_crs)
    
    # Calculate length in meters
    new_gdf['length_m'] = new_gdf.geometry.length
    
    # Ensure all are MultiLineString
    def ensure_multilinestring(geom):
        if geom.geom_type == 'LineString':
            return MultiLineString([geom])
        return geom

    new_gdf['geometry'] = new_gdf['geometry'].apply(ensure_multilinestring)
    
    # Save to GeoJSON
    new_gdf.to_file(output_file, driver='GeoJSON')
    print(f"Saved {len(new_gdf)} features to {output_file}")

if __name__ == "__main__":
    fix_and_convert('fiji_transects_wgs84.geojson', 'fiji_transects_fmg.geojson')
Wrote /work/solve.py (5019 chars).
0:51
Bash head -n 20 fiji_transects_wgs84.geojson
{
"type": "FeatureCollection",
"name": "fiji_transects_wgs84",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": [
{ "type": "Feature", "properties": { "transect_id": "T001", "vessel": "Taveuni II", "survey_date": "2025-08-15", "crosses_antimeridian_flag": true }, "geometry": { "type": "LineString", "coordinates": [ [ 178.941879580782086, -17.632301816020771 ], [ 179.456655009654696, -17.623768593111961 ], [ 179.971430438527307, -17.611072392823225 ], [ -179.513794132600054, -17.596198176111951 ], [ -178.999018703727444, -17.579632069513806 ], [ -178.484243274854833, -17.577321872344196 ] ] } },
{ "type": "Feature", "properties": { "transect_id": "T002", "vessel": "Bligh", "survey_date": "2025-08-12", "crosses_antimeridian_flag": true }, "geometry": { "type": "LineString", "coordinates": [ [ 179.070288824800542, -17.334767984150709 ], [ 179.725942881740252, -17.171343988196945 ], [ -179.618403061320009, -17.007726843860763 ], [ -178.962749004380299, -16.834850408534852 ] ] } },
{ "type": "Feature", "properties": { "transect_id": "T003", "vessel": "Lomaiviti", "survey_date": "2025-08-12", "crosses_antimeridian_flag": true }, "geometry": { "type": "LineString", "coordinates": [ [ 177.636947428758333, -17.358837040696127 ], [ 178.462815605623859, -17.416074837434927 ], [ 179.288683782489386, -17.471713663377283 ], [ -179.885448040645059, -17.527675804260884 ], [ -179.059579863779533, -17.590577543375694 ] ] } },
{ "type": "Feature", "properties": { "transect_id": "T004", "vessel": "Vanua I", "survey_date": "2025-08-15", "crosses_antimeridian_flag": true }, "geometry": { "type": "LineString", "coordinates": [ [ 178.873696381462679, -17.803295238757038 ], [ 179.542254331047587, -17.598477321703708 ], [ -179.789187719367533, -17.405549472537043 ], [ -179.120629769782624, -17.19411411231702 ], [ -178.452071820197745, -16.992332922174427 ], [ -177.783513870612836, -16.795171196845544 ] ] } },
{ "type": "Feature", "properties": { "transect_id": "T005", "vessel": "Bligh", "survey_date": "2025-08-19", "crosses_antimeridian_flag": true }, "geometry": { "type": "LineString", "coordinates": [ [ 177.596924830927293, -17.923255155112717 ], [ 178.160696712947697, -18.010328270600898 ], [ 178.724468594968101, -18.099224972140938 ], [ 179.288240476988506, -18.17532145144995 ], [ 179.85201235900891, -18.270380145331412 ], [ -179.584215758970686, -18.358875431719703 ], [ -179.020443876950281, -18.437390943572723 ] ] } },
{ "type": "Feature", "properties": { "transect_id": "T006", "vessel": "Cakaulevu", "survey_date": "2025-08-13", "crosses_antimeridian_flag": true }, "geometry": { "type": "LineString", "coordinates": [ [ 178.622166647099931, -18.382052393687179 ], [ 179.205668025282989, -18.184610858038685 ], [ 179.789169403466019, -17.991866703295319 ], [ -179.627329218350923, -17.789532271264445 ], [ -179.043827840167864, -17.595682751178369 ], [ -178.460326461984835, -17.393483000040479 ], [ -177.876825083801776, -17.203490564162109 ] ] } },
{ "type": "Feature", "properties": { "transect_id": "T007", "vessel": "Vanua I", "survey_date": "2025-08-19", "crosses_antimeridian_flag": true }, "geometry": { "type": "LineString", "coordinates": [ [ 177.920101619592742, -17.14979850360189 ], [ 178.697177550619955, -17.100522188212071 ], [ 179.474253481647168, -17.053867486482115 ], [ -179.74867058732562, -17.004197778897627 ], [ -178.971594656298407, -16.959481244370728 ], [ -178.194518725271195, -16.911697858015476 ] ] } },
{ "type": "Feature", "properties": { "transect_id": "T008", "vessel": "Taveuni II", "survey_date": "2025-08-12", "crosses_antimeridian_flag": true }, "geometry": { "type": "LineString", "coordinates": [ [ 179.401134548056262, -17.934415957637167 ], [ 179.67454249485786, -17.899654147497863 ], [ 179.947950441659486, -17.858130727687527 ], [ -179.778641611538916, -17.811143619533269 ], [ -179.50523366473729, -17.768768396969666 ], [ -179.231825717935692, -17.724708363613253 ] ] } },
{ "type": "Feature", "properties": { "transect_id": "T009", "vessel": "Vanua I", "survey_date": "2025-08-13", "crosses_antimeridian_flag": true }, "geometry": { "type": "LineString", "coordinates": [ [ 178.068433112639013, -16.657838811131668 ], [ 178.561564721122721, -16.689731320158675 ], [ 179.054696329606429, -16.72173241552732 ], [ 179.547827938090137, -16.748891897767297 ], [ -179.959040453426155, -16.775241845025921 ], [ -179.465908844942447, -16.799281899607834 ] ] } },
{ "type": "Feature", "properties": { "transect_id": "T010", "vessel": "Vanua I", "survey_date": "2025-08-15", "crosses_antimeridian_flag": true }, "geometry": { "type": "LineString", "coordinates": [ [ 177.602847396853463, -17.277026295424367 ], [ 179.128053569323441, -17.468285296635063 ], [ -179.346740258206609, -17.65419136085664 ], [ -177.82153408573663, -17.837325774502055 ] ] } },
{ "type": "Feature", "properties": { "transect_id": "T011", "vessel": "Taveuni II", "survey_date": "2025-08-20", "crosses_antimeridian_flag": false }, "geometry": { "type": "LineString", "coordinates": [ [ -176.863797870333627, -17.7932433540029 ], [ -176.985724572324699, -17.81273654528005 ], [ -177.107651274315742, -17.824236921378098 ], [ -177.229577976306814, -17.835861250474697 ], [ -177.351504678297886, -17.857559546831705 ], [ -177.473431380288929, -17.871769203842408 ], [ -177.595358082280001, -17.890225470404214 ] ] } },
{ "type": "Feature", "properties": { "transect_id": "T012", "vessel": "Taveuni II", "survey_date": "2025-08-20", "crosses_antimeridian_flag": false }, "geometry": { "type": "LineString", "coordinates": [ [ 176.312195951017685, -17.976122209608448 ], [ 176.362236324041447, -17.722210270969462 ], [ 176.412276697065209, -17.470306839752467 ], [ 176.462317070088972, -17.226475769084448 ] ] } },
{ "type": "Feature", "properties": { "transect_id": "T013", "vessel": "Bligh", "survey_date": "2025-08-19", "crosses_antimeridian_flag": false }, "geometry": { "type": "LineString", "coordinates": [ [ -176.70823848972006, -17.696306145080879 ], [ -177.205026853648661, -17.960082567744127 ], [ -177.701815217577291, -18.210737758337459 ], [ -178.198603581505893, -18.469124252379427 ] ] } },
{ "type": "Feature", "properties": { "transect_id": "T014", "vessel": "Lomaiviti", "survey_date": "2025-08-13", "crosses_antimeridian_flag": false }, "geometry": { "type": "LineString", "coordinates": [ [ 176.538496893308832, -16.594358164012139 ], [ 176.861572490827996, -16.71494251806207 ], [ 177.184648088347188, -16.832251271240672 ], [ 177.507723685866381, -16.976116506165042 ], [ 177.830799283385545, -17.090939089364483 ] ] } },
{ "type": "Feature", "properties": { "transect_id": "T015", "vessel": "Vanua I", "survey_date": "2025-08-15", "crosses_antimeridian_flag": false }, "geometry": { "type": "LineString", "coordinates": [ [ -177.278377449219306, -16.724372731501912 ], [ -177.470251917030794, -16.761535677586746 ], [ -177.662126384842253, -16.787182414326686 ], [ -177.854000852653712, -16.818799270133983 ], [ -178.0458753204652, -16.856282470705128 ], [ -178.237749788276659, -16.891308864567598 ], [ -178.429624256088147, -16.914729063096839 ] ] } },
1:50
Write /work/solve.py
content · 173 lines · py
import geopandas as gpd
import pandas as pd
from shapely.geometry import LineString, MultiLineString

def fix_and_convert(input_file, output_file):
    # Load the data
    gdf = gpd.read_file(input_file)
    print(f"Loaded {len(gdf)} features.")

    # Fiji National Metric Grid
    # The prompt asks for "Fiji's national metric grid".
    # Based on the coordinates in the file, they are near the antimeridian.
    # Let's try EPSG:32759 (UTM 59S) or 32760 (UTM 60S).
    # Actually, for Fiji, UTM 59S or 60S are the standard.
    # Let's use EPSG:32759.
    target_crs = "EPSG:32759" 

    fixed_features = []

    for idx, row in gdf.iterrows():
        geom = row.geometry
        attrs = row.drop('geometry').to_dict()
        
        # The problem is that some LineStrings cross the antimeridian.
        # e.g., [179, -17] to [-179, -17].
        # This is interpreted by many systems as a line going the long way around the world.
        # To fix this, we need to split the line at the antimeridian.
        
        if geom.geom_type == 'LineString':
            coords = list(geom.coords)
            new_segments = []
            current_segment = [coords[0]]
            
            for i in range(1, len(coords)):
                prev_lon = coords[i-1][0]
                curr_lon = coords[i][0]
                
                # Check for antimeridian crossing
                # A crossing occurs if the difference in longitude is > 180
                # Or if one is positive and one is negative and they are far apart.
                # Actually, if they cross the antimeridian, the longitude jumps from ~180 to ~-180.
                # The delta would be ~ -360.
                
                diff = curr_lon - prev_lon
                
                if diff > 180:
                    # Jump from -180 to 180 (e.g. -179 to 179 is a diff of 358)
                    # This means the line is actually going the short way.
                    # But wait, if the diff is > 180, it's moving "eastward" across the -180/180 line.
                    # If the diff is < -180, it's moving "westward".
                    pass # This is the standard way.
                
                # The problem described: "render as arcs spanning the entire globe".
                # This means the LineString has a jump from e.g. 179 to -179.
                # In a planar representation, this is a line of length 358 degrees.
                # We want to split this into two segments: one ending at 180 and one starting at -180.
                
                # Let's check the jump.
                if abs(diff) > 180:
                    # It's a jump. We need to split.
                    # To split correctly, we don't actually need to "create" a point at 180/ -180
                    # unless we want to be very precise, but splitting the LineString 
                    # into two at this vertex will result in two segments that 
                    # when projected will not "arc" the long way.
                    
                    # Let's close the current segment and start a new one.
                    # But we must handle the longitude wrap for the projection to work.
                    # A better way: Adjust the longitude of the "jumped" coordinates.
                    
                    # If we want to keep it as a single "transect" but as a MultiLineString,
                    # we split it at the vertex where the jump occurs.
                    
                    # Close current segment
                    if len(current_segment) > 1:
                        new_segments.append(LineString(current_segment))
                    
                    # Start new segment
                    current_segment = [coords[i-1], coords[i]] # This is slightly wrong, should be current_segment = [coords[i-1], coords[i]]
                    # Actually, if we split at the jump, the segment is [..., coords[i-1]] and [coords[i], ...]
                    # But coords[i-1] and coords[i] are the points that form the long jump.
                    # We should split it such that the first segment ends at coords[i-1] 
                    # and the second starts at coords[i].
                    
                    # Let's refine:
                    # We are iterating through points.
                    # If the jump between i-1 and i is too large, we treat the segment between 
                    # i-1 and i as a break point.
                    
                    # Wait, the prompt says: "the problematic ones must end up as multi-part geometries".
                    # This confirms we should split at the jump.
                    
                    # Let's restart the loop logic for segments.
                    pass
            
            # Let's re-do the segmenting logic properly.
            segments = []
            temp_coords = [coords[0]]
            for i in range(1, len(coords)):
                p1 = coords[i-1]
                p2 = coords[i]
                if abs(p2[0] - p1[0]) > 180:
                    # Jump detected!
                    if len(temp_coords) > 1:
                        segments.append(LineString(temp_coords))
                    temp_coords = [p2]
                else:
                    temp_coords.append(p2)
            if len(temp_coords) > 1:
                segments.append(LineString(temp_coords))
            
            if len(segments) > 1:
                new_geom = MultiLineString(segments)
            elif len(segments) == 1:
                new_geom = MultiLineString([segments[0]])
            else:
                new_geom = geom # Should not happen
                
            fixed_features.append({'geometry': new_geom, **attrs})
        
        elif geom.geom_type == 'MultiLineString':
            # Even if it's already MultiLineString, we keep it.
            fixed_features.append({'geometry': geom, **attrs})
        else:
            fixed_features.append({'geometry': geom, **attrs})

    # Create new GeoDataFrame
    new_gdf = gpd.GeoDataFrame(fixed_features, crs=gdf.crs)
    
    # Re-project to Fiji's national metric grid
    # Using EPSG:32759 (UTM 59S) as a representative metric projection for Fiji.
    # Note: Fiji actually spans multiple UTM zones, but for a single dataset 
    # like this, one projection is usually used for the report.
    new_gdf = new_gdf.to_crs(target_crs)
    
    # Calculate length in meters
    new_gdf['length_m'] = new_gdf.geometry.length
    
    # The prompt says "Every feature must come out as a MultiLineString".
    # Let's ensure this.
    def ensure_multilinestring(geom):
        if geom.geom_type == 'LineString':
            return MultiLineString([geom])
        return geom

    new_gdf['geometry'] = new_gdf['geometry'].apply(ensure_multilinestring)
    
    # Keep only required columns: transect_id, vessel, survey_date, length_m, and geometry
    # The prompt says "Carry the survey attributes (vessel and survey_date) through unchanged".
    # It doesn't say to remove others, but let's be safe.
    # Let's keep transect_id, vessel, survey_date, length_m and geometry.
    # Actually, the prompt implies we should just carry the attributes through.
    # Let's check what columns are there.
    
    # Re-order columns to be clean: geometry, transect_id, vessel, survey_date, length_m
    # and any other original ones if they exist.
    cols = ['geometry', 'transect_id', 'vessel', 'survey_date', 'length_m']
    # Add any other columns that were in the original gdf but not in our list.
    original_cols = list(gdf.columns)
    for c in original_cols:
        if c not in cols and c != 'geometry':
            cols.append(c)
            
    # Filter cols to only those that actually exist in new_gdf
    cols = [c for c in cols if c in new_gdf.columns]
    new_gdf = new_gdf[cols]

    # Save to GeoJSON
    new_gdf.to_file(output_file, driver='GeoJSON')
    print(f"Saved {len(new_gdf)} features to {output_file}")

if __name__ == "__main__":
    fix_and_convert('fiji_transects_wgs84.geojson', 'fiji_transects_fmg.geojson')
Wrote /work/solve.py (8124 chars).
1:52
Bash python solve.py
Loaded 30 features.
Saved 30 features to fiji_transects_fmg.geojson
1:54
Bash head -n 20 fiji_transects_fmg.geojson
{
"type": "FeatureCollection",
"name": "fiji_transects_fmg",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:EPSG::32759" } },
"features": [
{ "type": "Feature", "properties": { "transect_id": "T001", "vessel": "Taveuni II", "survey_date": "2025-08-15T00:00:00", "length_m": 221159.18064439343, "crosses_antimeridian_flag": true }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 1344698.091260567773134, 8032679.83811979368329 ], [ 1399810.651028483174741, 8031228.529548802413046 ], [ 1455011.062730471137911, 8030088.561514246277511 ] ], [ [ 1510295.846065002959222, 8029038.755770234391093 ], [ 1565668.013747079763561, 8028024.858959089033306 ], [ 1621032.79852227284573, 8025257.887113350443542 ] ] ] } },
{ "type": "Feature", "properties": { "transect_id": "T002", "vessel": "Bligh", "survey_date": "2025-08-12T00:00:00", "length_m": 146076.18180651095, "crosses_antimeridian_flag": true }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 1359843.516400819178671, 8065281.88416144810617 ], [ 1430963.137199885211885, 8080443.896912962198257 ] ], [ [ 1502307.235388816334307, 8095432.791667072102427 ], [ 1573935.825656000990421, 8111269.09505254868418 ] ] ] } },
{ "type": "Feature", "properties": { "transect_id": "T003", "vessel": "Lomaiviti", "survey_date": "2025-08-12T00:00:00", "length_m": 266290.46937002556, "crosses_antimeridian_flag": true }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 1206407.814512614160776, 8068501.813671448267996 ], [ 1294449.837433690438047, 8058866.920303306542337 ], [ 1382579.472401974955574, 8048997.502734992653131 ] ], [ [ 1470803.325105420779437, 8038672.811740033328533 ], [ 1559096.148641606559977, 8027144.381898006424308 ] ] ] } },
{ "type": "Feature", "properties": { "transect_id": "T004", "vessel": "Vanua I", "survey_date": "2025-08-15T00:00:00", "length_m": 302265.28088452417, "crosses_antimeridian_flag": true }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 1336605.844503158004954, 8013921.800736508332193 ], [ 1409102.429167224094272, 8033637.620970964431763 ] ], [ [ 1481793.669104459229857, 8051827.127515953034163 ], [ 1554850.078502856660634, 8071894.735777610912919 ], [ 1628126.403999570757151, 8090697.460567154921591 ], [ 1701653.236771894851699, 8108801.659118727780879 ] ] ] } },
{ "type": "Feature", "properties": { "transect_id": "T005", "vessel": "Bligh", "survey_date": "2025-08-19T00:00:00", "length_m": 304679.59079607337, "crosses_antimeridian_flag": true }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 1199931.710594916250557, 8005865.670202534645796 ], [ 1259616.830871660495177, 7993940.682438323274255 ], [ 1319291.188525671139359, 7981605.036231424659491 ], [ 1379030.787966610863805, 7970486.467112833634019 ], [ 1438680.872027168981731, 7957038.266833174973726 ] ], [ [ 1498372.49110521748662, 7944104.358074418269098 ], [ 1558138.329570952802896, 7932066.50661921966821 ] ] ] } },
{ "type": "Feature", "properties": { "transect_id": "T006", "vessel": "Cakaulevu", "survey_date": "2025-08-13T00:00:00", "length_m": 331719.7096676153, "crosses_antimeridian_flag": true }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 1307067.777443595230579, 7950544.548676379024982 ], [ 1370177.745611329097301, 7969848.297526623122394 ], [ 1433471.360507762059569, 7988474.778038176707923 ] ], [ [ 1497029.458512069191784, 8008024.761288339272141 ], [ 1560758.060178135987371, 8026482.793417557142675 ], [ 1624759.44774585403502, 8045738.120637344196439 ], [ 1688911.654150674119592, 8063489.824120609089732 ] ] ] } },
{ "type": "Feature", "properties": { "transect_id": "T007", "vessel": "Vanua I", "survey_date": "2025-08-19T00:00:00", "length_m": 335218.19876608427, "crosses_antimeridian_flag": true }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 1237502.277810910250992, 8090694.689995049498975 ], [ 1320931.718239604029804, 8093039.758103337138891 ], [ 1404519.759566597174853, 8094765.465034479275346 ] ], [ [ 1488306.395239400910214, 8096500.310450326651335 ], [ 1572263.300812230212614, 8097352.628193372860551 ], [ 1656447.568506362847984, 8098218.611695680767298 ] ] ] } },
{ "type": "Feature", "properties": { "transect_id": "T008", "vessel": "Taveuni II", "survey_date": "2025-08-12T00:00:00", "length_m": 118642.92293674583, "crosses_antimeridian_flag": true }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 1392304.284291165648028, 7996822.779690116643906 ], [ 1421704.730277994647622, 7999353.980411183089018 ], [ 1451170.496637997217476, 8002600.665644915774465 ] ], [ [ 1480698.180475640110672, 8006419.214547385461628 ], [ 1510233.405504569876939, 8009683.612990100868046 ], [ 1539811.533893035259098, 8013097.977884992957115 ] ] ] } },
{ "type": "Feature", "properties": { "transect_id": "T009", "vessel": "Vanua I", "survey_date": "2025-08-13T00:00:00", "length_m": 212667.00658952157, "crosses_antimeridian_flag": true }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 1255351.61249668803066, 8144890.848368939012289 ], [ 1308163.47915534931235, 8139388.339649711735547 ], [ 1361007.170226513408124, 8133731.724176112562418 ], [ 1413909.721510160714388, 8128472.32473496068269 ] ], [ [ 1466857.937276012962684, 8123159.765445601195097 ], [ 1519863.922686790814623, 8117960.88573806732893 ] ] ] } },
{ "type": "Feature", "properties": { "transect_id": "T010", "vessel": "Vanua I", "survey_date": "2025-08-15T00:00:00", "length_m": 330094.38968315674, "crosses_antimeridian_flag": true }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 1203078.592147734947503, 8077728.524170853197575 ], [ 1365395.961181854829192, 8050124.954019954428077 ] ], [ [ 1527891.016646987758577, 8021633.449601196683943 ], [ 1690645.445608739973977, 7991908.331902587786317 ] ] ] } },
{ "type": "Feature", "properties": { "transect_id": "T011", "vessel": "Taveuni II", "survey_date": "2025-08-20T00:00:00", "length_m": 79825.300494248062, "crosses_antimeridian_flag": false }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 1794191.417767617618665, 7990350.993124740198255 ], [ 1780888.267749300226569, 7989015.660567439161241 ], [ 1767650.939104072283953, 7988572.723735860548913 ], [ 1754419.26934725465253, 7988107.519663493148983 ], [ 1741122.454776630038396, 7986500.44570155069232 ], [ 1727886.305670389439911, 7985728.23646823503077 ], [ 1714627.350537037011236, 7984470.423931509256363 ] ] ] } },
{ "type": "Feature", "properties": { "transect_id": "T012", "vessel": "Taveuni II", "survey_date": "2025-08-20T00:00:00", "length_m": 84792.988823194944, "crosses_antimeridian_flag": false }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 1063096.267279519233853, 8004383.541167807765305 ], [ 1069224.295318548567593, 8032422.456497728824615 ], [ 1075350.396640087477863, 8060240.609874066896737 ], [ 1081455.274303405079991, 8087164.681165600195527 ] ] ] } },
{ "type": "Feature", "properties": { "transect_id": "T013", "vessel": "Bligh", "survey_date": "2025-08-19T00:00:00", "length_m": 182757.485402597, "crosses_antimeridian_flag": false }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 1811714.879919562255964, 8000168.898809044621885 ], [ 1756168.591106696520001, 7973954.633936420083046 ], [ 1700937.161532202037051, 7949150.262404534965754 ], [ 1645868.056713705649599, 7923403.627205853350461 ] ] ] } },
{ "type": "Feature", "properties": { "transect_id": "T014", "vessel": "Lomaiviti", "survey_date": "2025-08-13T00:00:00", "length_m": 149104.42585972216, "crosses_antimeridian_flag": false }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 1091565.519554407335818, 8157134.196642125025392 ], [ 1125777.754002129193395, 8142749.529362777248025 ], [ 1159971.129910041112453, 8128658.795175407081842 ], [ 1194037.587388216285035, 8111543.367380794137716 ], [ 1228178.119443017058074, 8097584.519823374226689 ] ] ] } },
{ "type": "Feature", "properties": { "transect_id": "T015", "vessel": "Vanua I", "survey_date": "2025-08-15T00:00:00", "length_m": 126707.08608488939, "crosses_antimeridian_flag": false }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 1756871.682594940531999, 8113562.764295527711511 ], [ 1735814.609104930888861, 8110613.430592520162463 ], [ 1714852.587353631621227, 8108942.377833182923496 ], [ 1693869.680285978130996, 8106581.949914878234267 ], [ 1672868.20646298234351, 8103544.891809856519103 ], [ 1651901.39675632561557, 8100766.698307007551193 ], [ 1631024.038523247465491, 8099273.546447046101093 ] ] ] } },
2:20